窗口函数
- MySQL从8.0开始支持窗口函数,也称分析函数(处理相对复杂的报表统计分析场景),这个功能在大多商业数据库和部分开源数据库中早已支持。
- 窗口:满足某种条件的记录集合
- 窗口函数:在窗口内使用的函数,也就是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,窗口大小都是固定的,这种属于静态窗口;不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。
函数名([expr]) over子句
函数名([expr]) over (
partition by <列名>
order by <列名>
rows between 开始位置 and 结束位置
)
- over是关键字,用来指定函数执行的窗口范围,包含三个分析子句
1、分组(partition by)子句,搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。
2、排序(order by)子句,是排序的意思,是该窗口中的
3、窗口(rows)子句, 是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。
PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用)
UNBOUNDED PRECEDING 表示该窗口最前面的行(起点)
UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点)
比如说:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行)
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行)
ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点)
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 fol1owing
#从前面三行和下面一行, 总共五行
#当order by后面缺少窗口从句条件, 窗口规范默认 是rows between unbounded preceding and current
row.
#当order by和窗口从句都缺失,窗口规范默认是rows between unbounded preceding and unbounded
fo11owing
- over()函数中如果不使用这三个函数,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算
举个简单的例子
sum(A)...... over(
partition by ...B...
order by ...C...
rows between ..D1.... and ..D2...
)
A:需要被加工的字段名称
B:分组的字段名称
C:排序的字段名称
D:计算的行数范围
在这里插入代码片