窗口函数
- 1 定义
- 2 聚合窗口函数
- 2.1 默认效果/累计效果
- 2.2 前面两行+当前一行
- 2.3 前面一行+当前一行+后面一行
- 3 排名窗口函数
- 3.1 排名函数
- 3.1.1 排名函数案例
- 3.2 累积分布
- 4 取值窗口函数
1 定义
完整的窗口函数定义如下:
window_function([expression]) over(partition byorder byframe_clause
)
其中window_function是窗口函数的名称,expression是可选择的分析对象
partition by包含分区类似group by
order by排序
frame_clause窗口大小
2 聚合窗口函数

2.1 默认效果/累计效果
rows between unbounded preceding and current row默认效果/累计效果

比如说可以用于查找短期之内(5天)累计转账超过100万元的账号
2.2 前面两行+当前一行
rows between 2 preceding and current row 前面两行+当前一行

2.3 前面一行+当前一行+后面一行
rows between 1 preceding and 1 following 前面一行+当前一行+后面一行

3 排名窗口函数
3.1 排名函数
排名窗口函数可以用来获取数据的分类排名。常见的排名窗口函数如下:
row_number()函数可以为分区中的每行数据分配一个序列号,序列号从1开始
rank 函数返回当前行在分区中的名次。如果存在名次相同的数据,后续的排名将会产生跳跃。
dense_rank()函数返回当前行在分区中的名次。紧凑排名,不产生跳跃
percent_rank()函数以百分比的形式返回当前行在分区中的名次。如果存在名次相同的数据,后续的排名将会产生跳跃。


更方便的写法:
select emp_name,dept_id,salary,row_number() over w rn,rank() over w rk
from employee e
window w as (partition by dept_id order by salary desc);
3.1.1 排名函数案例
牛客:对所有员工的薪水按照salary降序进行1-N的排名
select emp_no,salary,dense_rank() over (order by salary desc) t_rank
from salaries
order by t_rank asc,emp_no asc
学完窗口函数,仿佛发现新大陆
3.2 累积分布
cume dist()函数计算当前行在分区内的累积分布。
ntile()函数将分区内的数据分为N等份,并返回当前行所在的分片位置。


ntile()函数:

4 取值窗口函数
LAG函数可以返回窗口内当前行之前的第N行数据。
LEAD函数可以返回窗口内当前行之后的第N行数据。
FIRST_VALUE函数可以返回窗口内第一行数据。
LAST_VALUE函数可以返回窗口内最后一行数据
NTH_VALUE函数可以返回窗口内第N行数据。
我还没有系统性学习这个,先放在这
视频链接:【MySQL编程思想】第46节 同比环比及复合增长率