- 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 适用于各个分区 。要将结果集作为一个整体进行排序 , 请在查询顶层包含 ORDER BY 。
- frame_clause: frame是当前分区的子集 , 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;
文章插图
frame 子句语法:
frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}
在没有frame子句的情况下 , 默认frame取决于是否存在ORDER BY子句 。frame_units值表示当前行和帧行之间的关系类型:
ROWS
: frame由开始行和结束行位置定义 。偏移量是行号与当前行号之间的差异 。RANGE
: 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}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- mac通过docker一键部署MySQL8
- day07-2MySQL索引
- CentOS部署MySQL
- MySQL用户也可以是个角色
- python+request+pymysql+pytest数据驱动
- CentOS 7.9 安装 MySQL 5.7.35
- 关于windows-server-下MySQL Community版本的的安装与配置
- 窗口报身份证号可以买票么
- 零点定理是什么