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个桶,记录桶的编号

基本语法

 

posted @ 2025-04-10 14:32  KLAPT  阅读(32)  评论(0)    收藏  举报