MySQL 窗口函数( 二 )


  • window_name: 由查询中其他地方的window子句定义的窗口的名称 。如果window_name单独出现在OVER子句中 , 则它完全定义了窗口 。如果分区、排序或分帧子句也给出了 , 它们会修改被命名窗口的解释 。
  • partition_clause: PARTITION BY 子句指示如何将查询行分组 。给定行的窗口函数结果基于包含该行的分区的行 。如果省略 PARTITION BY , 则有一个由所有查询行组成的分区 。partition_clause:PARTITION BY expr [, expr] ...
  • order_clause: ORDER BY 子句指示如何对每个分区中的行进行排序 。根据 ORDER BY 子句相等的分区行被视为对等 。如果省略 ORDER BY , 则分区行是无序的 , 没有隐含的处理顺序 , 并且所有分区行都是对等的 。order_clause:ORDER BY expr [ASC|DESC] [, expr [ASC|DESC]] ...
每个ORDER BY表达式后面可以有选择地跟着ASC或DESC来表示排序方向 。NULL 值首先进行升序排序 , 最后进行降序排序 。
窗口定义中的 ORDER BY 适用于各个分区 。要将结果集作为一个整体进行排序 , 请在查询顶层包含 ORDER BY 。
  • frame_clause: frame是当前分区的子集 , frame子句指定如何定义该子集 。
小结:
窗口 , 就是数据范围 , 也可以理解为记录集合 , 窗口函数就是在满足某种条件的记录集合上执行的特殊函数 。即 , 应用在窗口内的函数 。
  • 静态窗口:窗口大小是固定的 , 窗口内的每条记录都要执行此函数
  • 动态窗口:也叫滑动窗口 , 窗口大小是变化的
窗口函数有以下功能:
  • 同时具有分组和排序的功能
  • 不减少原表的行数
2. 窗口函数frame规范
一个frame是当前分区的一个子集 , frame子句指定如何定义这个子集 。
【MySQL 窗口函数】frame是根据当前行确定的 , 这使得frame可以根据当前行在分区中的位置在分区中移动 。
  • 通过将一个frame定义为从分区开始到当前行的所有行 , 我们可以计算每一行的运行总数 。
  • 通过将一个frame定义为在当前行的每一边扩展N行 , 我们可以计算滚动平均 。
下面的查询演示了如何使用移动帧来计算每组按时间顺序排列的值的总和 , 以及从当前行和紧随其后的行计算的滚动平均值:
SELECTmanufacturer, `month`, profit,SUM(profit) OVER(PARTITION BY manufacturerORDER BY `month`ROWS unbounded PRECEDING) AS running_total,AVG(profit) OVER(PARTITION BY manufacturerORDER BY `month`ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS running_averageFROMsales;
MySQL 窗口函数

文章插图
frame 子句语法:
frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}在没有frame子句的情况下 , 默认frame取决于是否存在ORDER BY子句 。
frame_units值表示当前行和帧行之间的关系类型:
  • ROWS: frame由开始行和结束行位置定义 。偏移量是行号与当前行号之间的差异 。
  • RANGE: frame由值范围内的行定义 。偏移量是行值与当前行值之间的差异 。
frame_extend 表示frame的起始点和结束点 。可以只指定frame的开始(在这种情况下 , 当前行隐式地是结束)或使用BETWEEN指定frame的两个端点:
frame_extent:{frame_start | frame_between}frame_between:BETWEEN frame_start AND frame_endframe_start, frame_end: {CURRENT ROW| UNBOUNDED PRECEDING| UNBOUNDED FOLLOWING| expr PRECEDING| expr FOLLOWING}

经验总结扩展阅读