SQL窗口函数
窗口的意思是将数据进行分组,每个分组即是一个窗口,这和使用聚合函数时的group by分组类似,但与聚合函数不同的地方是: 聚合函数(例如:sum/avg/min/max)会针对每个分组(窗口)聚合出一个结果(每一组返回一个结果
)。 窗口函数会对每一条数据进行计算,并不会使返回的数据变少(每一行返回一个结果
)。
窗口函数可以分为两类:
一类既可以做为聚合函数
,也可以作为窗口函数,当函数单独使用时是聚合函数,当与over关键字同时使用时作为窗口函数。
另一类是专用窗口函数
,他们必须与 over 关键字同时使用。
专用窗口函数
序号函数:
-
row_number() 顺序排序:对数据中的序号进行顺序显示,不管其排序结果是否出现重复值,排序结果为1,2,3,4,5…
-
rank() 并列排序:相同字段数值并列排序,且跳过重复序号,如, 1,1,3,4,5 。rank函数没有参数,但需要指定按照那个字段进行排名,所以使用rank函数必须用order by参数,order by的排序字段就是排名字段
-
dense_rank() 并列排序:相同字段数值并列排序,且不跳过重复序号,如:1,1,2,3,4
分布函数:
-
percent_rank()
累计百分比。
函数计算结果为:小于该条记录值的所有记录的行数/该分组的总行数-1,所以该记录的返回值为[0,1]。和之前的RANK()函数相关,每行按照如下公式进行计算: (rank - 1) / (rows - 1) 其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数。 -
cume_dist()
累计分布值。
分组值小于等于当前值的行数与分组总行数的比值 ,(0,1]。 分组内大于等于当前rank值的行数/分组内总行数。(常用)
前后函数:
-
lag(expr,n) 返回当前行的前n行的expr的值
-
lead(expr,n) 返回当前行的后n行的expr的值
头尾函数:
-
first_value(expr) 返回第一个expr的值
-
last_value(expr) 返回最后一个expr的值
其他函数:
-
nth_value(expr,n) 返回第n个expr的值
-
ntile(n) 将分区中的有序数据分为n个桶,记录桶的编号
基本语法