【mysql】 窗口函数
背景
- MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数。
- 窗口函数分为静态窗口和滑动窗口,静态窗口的大小是固定的,滑动窗口的大小可以根据设置进行变化,在当前窗口下生成子窗口。
窗口函数针对over后对窗口范围内的每条记录都执行这个窗口函数,举个例子:
SELECT gender, day, SUM(score_points) OVER (PARTITION BY gender ORDER BY day) AS total FROM Scores;
中的SUM(score_points) OVER (PARTITION BY gender ORDER BY day) ,表示针对gender分组,对day排序的窗口每条记录都执行sum(score_points)累计分数的操作
语法
函数名([参数])
over(
partition by [分组字段]
order by [排序字段] asc/desc
rows/range between 起始位置 and 结束位置
)
- 函数名称,开窗函数的数量较少,只有11个窗口函数(rank, dense_rank, row_number)+聚合函数(sum. avg, count, max, min)
- over语句,over()是必须要写的,里面有三个参数,都是非必须参数,根据需求选写
- 第一个参数是 partition by +分组字段,将数据根据此字段分成多份,如果不加partition by参数,那会把整个数据当做一个窗口。
- 第二个参数是 order by +排序字段,每个窗口的数据要不要进行排序。
- 第三个参数 rows/range between start and end,这个参数仅针对滑动窗口函数有用,是在当前窗口下分出更小的子窗口。
起始位置和结束位置可写:
rows between 2 preceding and current row # 取当前行和前面两行
rows between unbounded preceding and current row # 包括本行和之前所有的行
rows between current row and unbounded following # 包括本行和之后所有的行
rows between 3 preceding and current row # 包括本行和前面三行
rows between 3 preceding and 1 following # 从前面三行和下面一行,总共五行
当order by后面缺少窗口从句条件,窗口规范默认是rows between unbounded preceding and current row.
当order by和窗口从句都缺失, 窗口规范默认是 rows between unbounded preceding and unbounded following