窗口函数也就是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行,窗口的大小是固定的,这种属于静态窗口;不同的记录对应着不同的窗口,这种动态变化的窗口叫做滑动窗口。
窗口函数的基本用法如下:
函数名(开窗字段) over(子句)
其中over是关键字,用来指定函数执行的窗口范围,包含三个分析子句:
- 分组(partition by)子句类似group by
- 排序(order by)子句
- 窗口(rows)子句
如果后面的括号中什么都不写,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算;如果不为空,则支持以下语法来设置窗口:
函数名() over(partition by<要分组的字段> over by <要排序的字段> rows between <数据范围>)
如:
sum(A) over(partition by B order by C rows between D1 and D2)
A:需要被加工的字段名称
B:分组的字段名称
C:排序的字段名称
D:计算的行数范围
# 取当前行和前面所有行 rows between unbounded preceding and current row # 包括本行和之后所有的行 rows between current row and unbounded following # 当前行和前面三行 rows between 3 preceding and current row # 前面三行和下面一行总共五行 rows between 3 preceding and 1 following
当order by 后面缺少窗口从句条件,窗口规范默认是rows between unbounded preceding and current row
当order by和窗口从句都缺失,窗口规范默认是rows between unbounded preceding and unbounded following
窗口函数的应用
1,专有窗口函数
- rank() : 排序结果为:1,1,3,4,5
- row_number():排序结果为:1,2,3,4,5
- dense_rank():排序结果为:1,1,2,3,4
2.聚合类窗口函数
聚合函数一般和group by一起使用,但是窗口环境下,聚合函数也可以应用进来,那么此时就是聚合类窗口函数。
sum(),count(),avg(),max(),min()
posted on
浙公网安备 33010602011771号