2026-06-27 20:56:15
窗口函数
窗口函数可以看作是在分区对记录执行操作的函数,其功能与GROUP BY相似,但不会改变记录行数,因此常用于排名、TopN等操作。
一、窗口函数语法形式
窗口函数的基本语法形式为:窗口函数 over ([partition by 字段名] [order by 字段名])
二、窗口函数两大形式
窗口函数主要分为两大类:非聚合函数作为窗口函数和聚合函数作为窗口函数。
(一)非聚合函数作为窗口函数
非聚合函数作为窗口函数时,主要包括序号函数、分布函数、前后函数、头尾函数等几类。
序号函数
rank():计算数值在列中排序,返回的排序可以有重复数字,有排序间隔(如1,1,3)。
dense_rank():计算数值在列中排序,返回的排序可以有重复数字,但没有排序间隔(如1,1,2)。
row_number():计算数值在列中排序,返回的排序没有重复数字,也没有排序间隔(如1,2,3)。

分布函数
cume_dist():计算某个值在一组有序的数据中累计分布百分比。返回值=当前计算值所在位置/总行数,如果存在重复值,计算时取重复值的最后一行的位置。
percent_rank():计算某个值在一组有序的数据中累计分布百分比。返回值=(rank-1)/(rows-1),如果存在重复值,计算时取重复值的最后一行的位置。


前后函数
lag(expr, offset, defval=null):查询同一字段的前N行数据。expr为要取的列,offset为取偏移后的第几行数据,defval为无偏移值的取值,默认为NULL。
lead(expr, offset, defval=null):查询同一字段的后N行数据。参数含义与lag相同。

头尾函数
first_value(expr):获取分区结果集中的第一行。expr为要选取的字段。
last_value(expr):获取分区结果集中的最后一行。expr为要选取的字段。

其他窗口函数
nth_value(expr, n):从分区结果集中的第N行获取值。expr为窗口函数选取的字段,n为分区或结果集的第n行。
ntile(n):将排序分区中的行划分为特定数量的组。在每个组分配一个从1开始的桶号,桶号最大为n,且桶号表示行所属的组。

(二)聚合函数作为窗口函数
sum、max、count、min、avg等聚合函数用作窗口函数时,可以获得累加值、累计区间内最大值、最小值、平均值、累计行数等。

综上所述,窗口函数是一种强大的数据分析工具,能够基于分区和排序对数据进行灵活的计算和分析。通过合理使用窗口函数,可以极大地提高数据处理的效率和准确性。