窗口函数
- 1 定义
- 2 聚合窗口函数
- 2.1 默认效果/累计效果
- 2.2 前面两行+当前一行
- 2.3 前面一行+当前一行+后面一行
- 3 排名窗口函数
- 3.1 排名函数
- 3.1.1 排名函数案例
- 3.2 累积分布
- 4 取值窗口函数
1 定义
完整的窗口函数定义如下:
window_function([expression]) over(
partition by
order by
frame_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节 同比环比及复合增长率