MySQL-窗口函数

MySQL-窗口函数

起男 387 2022-05-16

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子句:为分区中的某个子集定义规则,可用用来作为滑动窗口使用