前言
在日常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_NUMBER 、RANK 、DENSE_RANK 、NTILE 等排序函数用在窗口函数中。 3.其他函数:例如计算数学相关的variance 、ratio_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 子句并不会影响最终结果的排序。其只是用来决定窗口函数按何种顺序计算
|