MySQL8 新特性窗口函数详解

MySQL中的窗口函数

函数(Function)的类型

目前支持的窗口函数可结合的函数有:

  1. 序号函数 ROW_NUMBER()

  2. 排名函数 RANK()DENSE_RANK()

    ⭐️row_number()、rank() 和dense_rank() 三种排序函数的区别:

    row_number:每一行记录生成一个序号,依次排序且不会重复。 1234...
    rank:跳跃排序,生成的序号有可能不连续。1134..
    dense_rank:在生成序号时是连续的。1123...

  3. 错行函数 lead()lag();

  4. 取值函数 First_value()last_value()

  5. 分箱函数 NTILE()

  6. 统计函数,也就是我们常用的聚合函数 MAX()、MIN()、AVG()、SUM()、COUNT()

over()子句

在Function函数之后需要跟上一个窗口函数over(),over()函数参数包括了三个子句(分组子句,排序子句和窗口子句),根据实际需求选择子句:

  1. partition by query_patition_clause:即分组,通过query_patition_clause进行分组,一般是表中的某一个字段,所以可以把partition by 看作与GROUP BY 具有相同功能的语法。

  2. order by order_by_clause:即排序,通过order_by_clause 进行排序,一般是在分组(partition by)之后再进行排序,如此一来,就是在组内进行排序。如果没有前面的分组子句(partition by),那么就是全部数据进行排序。和普通MySQL中的查询语句一样,排序从句也支持ASC和DESC的用法。

  3. frame_clause:窗口从句,它是排序之后的功能扩展,它标识了在排序之后的一个范围,它的格式是:

    rows | range between start_expr and end_expr
  • 其中rows和range为二选其一:

    1. rows是物理范围,即根据order by子句排序后,取的前N行及后N行的数据计算(与当前行的值无关,只与排序后的行号相关);

    2. range是逻辑范围,根据order by子句排序后,指定当前行对应值的范围取值行数不固定,只要行值在范围内,对应行都包含在内(当range和preceding/following一起使用时,使用的数据类型必须与order by表达式的数据类型相同);

  • between…and...用来指定范围的起始点和终结点,start_expr为起始点,end_expr为终结点(以当前行为起点或终点时,between…and…可省略)

    Start_expr为起始点,起始点有下面几种选项:

    1. unbounded preceding:指明窗口开始于分组的第一行,以排序之后的第一行为起点;

    2. current row:以当前行为起点;

    3. n preceding:以当前行的前面第n行为起点;

    4. n following:以当前行的后面第n行为起点;

    5. date范围用INTERVAL 6 DAY PRECEDING(前6天)

    end_expr为终结点,终结点有下面几种选项:

    1. unbounded following:以排序之后的最后一行为终点;

    2. current row:以当前行为终点;

    3. n preceding:以当前行的前面第n行为终点;

    4. n following:以当前行的后面第n行为终点;

    5. date范围用INTERVAL 6 DAY FOLLOWING(后6天)


MySQL8 新特性窗口函数详解
https://shikai.info/archives/mysql8-window-function-details
作者
石 凯
发布于
2023年08月19日
许可协议