MySQL 窗口函数( 二 )

  • frame_clause: frame是当前分区的子集,frame子句指定如何定义该子集 。
  • 小结:
    窗口,就是数据范围,也可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数 。即,应用在窗口内的函数 。
    • 静态窗口:窗口大小是固定的,窗口内的每条记录都要执行此函数
    • 动态窗口:也叫滑动窗口 , 窗口大小是变化的
    窗口函数有以下功能:
    • 同时具有分组和排序的功能
    • 不减少原表的行数
    2. 窗口函数frame规范
    一个frame是当前分区的一个子集,frame子句指定如何定义这个子集 。
    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}【MySQL 窗口函数】在没有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}使用BETWEEN语法,frame_start不能发生在frame_end之后 。
    允许的frame_start和frame_end值含义如下: