窗口函数

窗口函数
最新回答
夏了夏天

2026-06-27 20:56:15

窗口函数

窗口函数可以看作是在分区对记录执行操作的函数,其功能与GROUP BY相似,但不会改变记录行数,因此常用于排名、TopN等操作。

一、窗口函数语法形式

窗口函数的基本语法形式为:窗口函数 over ([partition by 字段名] [order by 字段名])

  • over:必选部分,用于指定函数执行的窗口范围。若后面括号中什么都不写,窗口函数将基于所有行进行计算;如果不为空,则支持以下两种语法设置窗口。
  • partition by:可选部分,指定分组字段,窗口函数在不同的分组上分别执行。
  • order by:可选部分,指定排序字段,窗口函数将根据记录排序后的顺序进行编号。

二、窗口函数两大形式

窗口函数主要分为两大类:非聚合函数作为窗口函数和聚合函数作为窗口函数。

(一)非聚合函数作为窗口函数

非聚合函数作为窗口函数时,主要包括序号函数、分布函数、前后函数、头尾函数等几类。

  1. 序号函数

    rank():计算数值在列中排序,返回的排序可以有重复数字,有排序间隔(如1,1,3)。

    dense_rank():计算数值在列中排序,返回的排序可以有重复数字,但没有排序间隔(如1,1,2)。

    row_number():计算数值在列中排序,返回的排序没有重复数字,也没有排序间隔(如1,2,3)。

  2. 分布函数

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

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

  3. 前后函数

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

    lead(expr, offset, defval=null):查询同一字段的后N行数据。参数含义与lag相同。

  4. 头尾函数

    first_value(expr):获取分区结果集中的第一行。expr为要选取的字段。

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

  5. 其他窗口函数

    nth_value(expr, n):从分区结果集中的第N行获取值。expr为窗口函数选取的字段,n为分区或结果集的第n行。

    ntile(n):将排序分区中的行划分为特定数量的组。在每个组分配一个从1开始的桶号,桶号最大为n,且桶号表示行所属的组。

(二)聚合函数作为窗口函数

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

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