IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 窗口函数深度探索(一):底层原理 -> 正文阅读

[大数据]窗口函数深度探索(一):底层原理

前言

在日常SQL数据分析中,经常会遇到需要在每组内排名,面对这类需求就需要使用sql的高级功能窗口函数了。一言以蔽之:在进行分组聚合以后 , 我们还想操作集合之前的数据就需要用到窗口函数

一、窗口函数的OLAP功能

窗口函数也称为分析函数,也称开窗函数,也可称OLAP函数。其中OLAP 是OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。为了便于理解,博主通常喜欢称之为窗口函数。常规的SELECT语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某一部分数据进行汇总、计算和排序。

二、完整语法

<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序列清单> 
[ROWS BETWEEN 开始位置 AND 结束位置])

几个重要说明:

(1)其中的[ ] 中的内容可以省略
(2)over()是窗口函数的标志,over()函数中包括三个函数包括:
分区 partition by 列名、
排序 order by 列名、
指定窗口范围 rows between 开始位置 and 结束位置
(3)在使用窗口函数时,over()函数中的这三个函数可组合使用也可以不使用。如果不使用这三个函数,窗口大小是针对查询产生的所有数据,如果指定了分区,窗口大小是针对每个分区的数据。
(4)PARTITON BY是用来分组,即选择要看哪个窗口,类似于GROUP BY 子句的分组功能,但是PARTITION BY 子句并不具备GROUP BY 子句的汇总功能,并不会改变原始表中记录的行数。PARTITION BY划分的范围被称为窗口,这也是窗口函数的由来。
(5)ORDER BY是用来排序,即决定窗口内,是按那种规则(字段)来排序的。
(6)窗口函数最关键的的是搞明白关键字PARTITION BY 和ORDER BY 的作用。

三、执行顺序

? 在加入窗口函数的基础上SQL的执行顺序也会发生变化,具体的执行顺序如下(window就是窗口)
在这里插入图片描述

四、窗口函数分类

大致来说,窗口函数可以分为三大类。

1.聚合函数:将SUM、MAX、MIN、first_value、last_value等聚合函数用在窗口函数中;
2.排序函数:将ROW_NUMBERRANKDENSE_RANKNTILE等排序函数用在窗口函数中。
3.其他函数:例如计算数学相关的varianceratio_to_report
更详细函数用法可参考博主文章
《Oracle开窗函数整理》
《Hive开窗函数整理》

五、控制窗口大小

CURRENT ROW:当前行  
n PRECEDING:往前n行数据 ,加上自身行
n FOLLOWING:往后n行数据 ,加上自身行
UNBOUNDED:起点,
UNBOUNDED PRECEDING 表示从前面的起点, 
UNBOUNDED FOLLOWING表示到后面的终点 
LAG  (scalar_expression [,offset] [,default])  : 往前第n行的数据
LEAD (scalar_expression [,offset] [,default]):往后第n行数据 
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,
编号从1开始,对于每一行,NTILE返回表内的信息

六、注意事项

原则上,窗口函数只能在SELECT 子句中使用,窗口函数OVER 中的ORDER BY 子句并不会影响最终结果的排序。其只是用来决定窗口函数按何种顺序计算

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:15:14  更:2022-05-07 11:16:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:20:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码