窗口,就是数据范围,也可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数 。即,应用在窗口内的函数 。
- 静态窗口:窗口大小是固定的,窗口内的每条记录都要执行此函数
- 动态窗口:也叫滑动窗口 , 窗口大小是变化的
- 同时具有分组和排序的功能
- 不减少原表的行数
一个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;
文章插图
frame 子句语法:
frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}
【MySQL 窗口函数】在没有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}
使用BETWEEN语法,frame_start不能发生在frame_end之后 。允许的frame_start和frame_end值含义如下:
CURRENT ROW
: 对于ROWS,边界是当前行 。对于RANGE,边界是当前行的对等点 。UNBOUNDED PRECEDING
: 边界是第一个分区行 。UNBOUNDED 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版本的的安装与配置
- CentOS 7 下安装 MySQL 8.x
- 初等数论学习笔记 III:数论函数与筛法