数据库进阶系列之开窗函数|九道门 | 函数

本文给大家介绍一个特殊的函数——开窗函数。
开窗函数是对数据库数据进行实时分析处理,别称OLAP函数(分析函数)。开窗函数是MySQL在8.0版本以后新加的功能,所以大家想要使用开窗函数,首先要把自己的MySQL版本升级到8.0以上。

数据库进阶系列之开窗函数|九道门 | 函数
文章插图

开窗函数其实就是一种在符合某种条件的数据集合上操作的特殊函数。开窗函数分为两种:

  • 第一种静态窗口时对每一条记录都执行了函数以后,窗口大小固定不变。
  • 第二种不同记录有可能对应不同窗口,这种动态变化的窗口叫做滑动窗口。
开窗函数跟聚合函数很类似,区别就是对数据的每一行都会返回计算结果,不会减少。具体的语法如下:

数据库进阶系列之开窗函数|九道门 | 函数
文章插图

开窗函数是在当前行(属于某一个窗口),这个窗口是由over关键字指定的,如果over后面的括号里面什么都不加,那么就是说窗口满足where条件的所有行,over之前的开窗函数对所有行都进行计算;如果不为空,就按照以下三个参数进行设置:
  • partition by子句:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别执行,在跨越分区边界时重新初始化。
  • order by子句:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和 partition by子句配合使用,也可以单独使用。
  • frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。
通常用between frame_start 和 frame_end语法来表示行的范围,frame_start和frame_end可支持:
  • current row 边界是当前行,一般和其他范围关键字一起使用
  • unbounded preceding 边界是分区中的第一行
  • unbounded following 边界是分区中的最后一行
  • expr preceding 边界是当前行减去expr的值
  • expr following 边界是当前行加上expr的值
那么具体的窗口函数是什么呢?
1、rank()函数显示区间重复间断的序号;
【 数据库进阶系列之开窗函数|九道门 | 函数】2、dense_rank()显示区间重复不间断的序号;
3、row_number()显示区间不重复不间断的序号。
示例:
首先查看自己的MySQL版本,确保是8.0以上的有开窗函数的功能。

数据库进阶系列之开窗函数|九道门 | 函数
文章插图


数据库进阶系列之开窗函数|九道门 | 函数
文章插图

可以发现”Server version: 8.0.26 MySQL Community Server - GPL“说明MySQL的版本是高于8.0的,那么就可以愉快的使用开窗函数啦。
  • rank()记录排序:

数据库进阶系列之开窗函数|九道门 | 函数
文章插图


数据库进阶系列之开窗函数|九道门 | 函数
文章插图

  • dense_rank()记录排序:

数据库进阶系列之开窗函数|九道门 | 函数
文章插图


数据库进阶系列之开窗函数|九道门 | 函数
文章插图

  • row_number()记录排序:

数据库进阶系列之开窗函数|九道门 | 函数
文章插图


数据库进阶系列之开窗函数|九道门 | 函数
文章插图

  • 聚合函数作为开窗函数:
可以将(sum,avg,count,max,min)等聚合函数引用至开窗函数中:

数据库进阶系列之开窗函数|九道门 | 函数

推荐阅读