SQL疑难之窗口函数
窗口函数
窗口函数(Window Functions)是一类特殊的函数,用于对数据集的行进行计算。这些函数通过定义一个窗口(window),即一组相关的行(通常与当前行有某种关联),来对数据进行计算。窗口函数常用于执行涉及排序、分组、排名、移动平均等操作的任务。
窗口函数定义
语法定义:
window_function(express) over(
[partition by part_list]
[order by order_list]
[{rows|range}between frame_start and frame_end]
)
partition by – 表示将数据按照part_lsit进行分区
order by – 表示将各个分区内的数据按照order_list进行排序
rows – 选择前后几行,例如:rows between 3 preceding and 3 following 表示往前三行和往后三行,共7行数据,或者小于7(边界)
range – 选择数据范围 例如: range between 3 preceding and 3 following 表示所有值在c-3,c+3这个范围内的行
窗口函数的使用
在逻辑语义上,一个窗口函数的执行过程如下:
- 按窗口定义,将所有输入数据分区、排序
- 对每一行数据,计算frame范围
- 将frame内的行集合输入窗口函数,计算结果填入当前行
窗口函数的执行分为排序和函数求值两部分
partition by 和 order by 就是在排序阶段完成的
对于函数求值,重点在frame处理- 对于整个分区的frame(如 range between unbounded preceding and unbounded following),只需要对整个分区计算一次
- 对于逐渐增长的frame(如: range between unbounded preceding and current row),可以用aggregator维护累加的状态
- 对于滑动的frame(如:rows between 3 proceding and 3 following),要求aggregator不仅支持增加还支持减少(removable)
练习推荐:牛客/leetcode
leetcode题目推荐:
1934、1907、1393、1341、1321、1204、1193、1174、1164等