MySQL-窗口函数
从MySQL8.0开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条纪录,而窗口函数是将结果置于每一条纪录中
窗口函数可以分为静态窗口函数
和动态窗口函数
- 静态窗口函数的窗口大小是固定的,不会因为纪录的不同而不同
- 动态窗口函数的窗口大小会随着纪录的不同而变化
常用函数
序号函数
函数 | 说明 |
---|---|
row_number() | 顺序排序 |
rank() | 并列排序,会跳过重复的序号,例如1、2、2、4 |
dense_rank() | 并列排序,不会跳过重复的序号,例如1、2、2、3 |
分布函数
函数 | 说明 |
---|---|
percent_rank() | 等级值百分比 |
percent_dist() | 累积分布值 |
前后函数
函数 | 说明 |
---|---|
lag(expr,n) | 返回当前行的前n行的expr的值 |
lead(expr,n) | 返回当前行的后n行的expr的值 |
首尾函数
函数 | 说明 |
---|---|
first_value(expr) | 返回第一个expr的值 |
last_value(expr) | 返回最后一个expr的值 |
其他函数
函数 | 说明 |
---|---|
nth_value(expr,n) | 返回第n个expr的值 |
ntile(n) | 将分区中的有序数据分为n个桶,纪录桶编号 |
语法结构
函数 over ([partition by 字段名 order by 字段名 asc|desc])
或
函数 over 窗口名 ...window 窗口名 as ([partition by 字段名 order by 字段名 asc|desc])
- over:指定窗口函数的范围
- 如果胜利后面括号中的内容,则窗口会包含满足where条件的所有纪录,窗口函数基于所有满足where条件的纪录进行计算
- 如果over关键字后面的括号不为空,则根据后面条件设置窗口
- 窗口名:为窗口设置一个别名,用来标识窗口
- partition by子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可用在每个分组中分别执行
- order by:指定窗口函数按照哪些字段进行排序。执行排序操作使窗口函数按照排序后的数据纪录的顺序进行编号
- frame子句:为分区中的某个子集定义规则,可用用来作为滑动窗口使用