【SQL】窗口函数sum() over ( partition by xx order by xx)
目录
语法
数据
示例1
示例2
小结
数据
借用这篇文章的表格【SQL】最后一个能上车的人
乘客需要依次上车,每位乘客携带的行李重量不同,而客车有1000kg行李载重限制
Queue表:
Turn | ID | Bus | Weight |
1 | 5 | A | 250 |
2 | 3 | A | 350 |
3 | 6 | A | 400 |
4 | 2 | B | 200 |
5 | 4 | B | 175 |
6 | 1 | B | 500 |
示例1
仅按照partition by开窗
select Turn, ID, Bus, weight, sum(weight) over(partition by Bus) T from Queue
Turn | ID | Bus | Weight | T |
1 | 5 | A | 250 | 1000 |
2 | 3 | A | 350 | 1000 |
3 | 6 | A | 400 | 1000 |
4 | 2 | B | 200 | 875 |
5 | 4 | B | 175 | 875 |
6 | 1 | B | 500 | 875 |
可以发现,窗口函数仅使用Partition by,类似于使用 group by 之后,对每一个分组进行一次 sum 计算,只是同一个分组下每一行都计算了相同的一次。
示例2
结合 partition by 和 order by 使用窗口函数
select Turn, ID, Bus, weight, sum(weight) over(partition by Bus order by Turn) T from Queue
Turn | ID | Bus | Weight | T |
1 | 5 | A | 250 | 250 |
2 | 3 | A | 350 | 600 |
3 | 6 | A | 400 | 1000 |
4 | 2 | B | 200 | 200 |
5 | 4 | B | 175 | 375 |
6 | 1 | B | 500 | 875 |
可以发现, 结合 partition by 和 order by 使用窗口函数后,意味着分组按行,对每一行之前的数据进行聚合计算,这种计算适合用于统计一些累加的数据分析,如http://t.csdnimg.cn/Dvdq5。
小结
sum(), count(),max(), min()作为窗口函数使用时:
- 需要指定聚合的列名
- 当只用 partition by 没使用 order by 时,计算按照每个分区全部数值计算
- 当同时使用 partition by 和 order by 时,计算按照逐行叠加
窗口函数可分为专用窗口函数和作为窗口函数使用的聚合函数:
- 专用窗口函数:row_number(),rank() ,dense_rank() 等
- 非专用窗口函数:max(),min(), sum(), count() 等