1. order by排序
在窗口函数中, 格式为:
xxx over (partition by xxx order by xxx)
其中, order by并不是必须的, 如果没有order by, 这个窗口函数的范围是全体, 这里我们通过一个表来讲解
num | part |
---|---|
1 | zzq |
2 | zzq |
3 | zzq |
4 | zzq |
5 | zzq |
这里的part字段是用来分区的, 由于窗口函数一定要分区, 我们使用part分区
那么当我们没有order by的时候, 结果为:
num | part | sum |
---|---|---|
1 | zzq | 15 |
2 | zzq | 15 |
3 | zzq | 15 |
4 | zzq | 15 |
5 | zzq | 15 |
而当我们有order by的时候, 结果为:
num | part | sum |
---|---|---|
1 | zzq | 1 |
2 | zzq | 3 |
3 | zzq | 6 |
4 | zzq | 10 |
5 | zzq | 15 |
这里不难发现, 当加了order by后, 它只会聚合在当前行之前的数据
2. 定义窗口函数的范围
当窗口函数不使用order by的时候, 默认的作用范围为所有, 而使用order by且不自定义范围的时候, 默认为从头到当前行聚合, 那么如何规定窗口函数范围呢?
格式: (从当前行到最后一行)
sum(num) over (partition by part order by num rows between current now and unbounded following)
这里就使用了between 1 and 2 函数, 在1的位置上, 是数据开始的位置, 2是结束的位置, 所以如果我们希望从这一行的上一行进行计算也可以实现, 接下来就是一些1 2 的指标有哪些:
unbounded preceding
: 从头开始
n preceding
: 从该行的前n行开始
current row
: 当前行
n following
: 到该行的后n行
unbounded following
: 到最后
注意: 这里并不是说current row前面就只能出现在1的位置, 也不是说后面的就只能在2的位置, 比方说:
between unbounded preceding and 1 preceding: 这里1和2都是使用的preceding, 那么这里的含义就是从头开始到该行的上一行。