前言
开窗函数很重要,一定要好好学,能够解决不少场景下的需求。
这是举例子的一张表
id | score | class | year |
---|---|---|---|
1 | 20 | 1 | 2024 |
2 | 40 | 1 | 2024 |
3 | 50 | 2 | 2024 |
4 | 10 | 2 | 2024 |
5 | 70 | 3 | 2024 |
正文
如上述表格。
select class, score, sum(score) over() as sum from table
score | class | sum |
---|---|---|
20 | 1 | 180 |
40 | 1 | 180 |
50 | 2 | 180 |
10 | 2 | 180 |
70 | 3 | 180 |
这是做了一个总体的汇总。
select class, score, sum(score) over(partipion by class) as sum from table
score | class | sum |
---|---|---|
20 | 1 | 60 |
40 | 1 | 60 |
50 | 2 | 60 |
10 | 2 | 60 |
70 | 3 | 70 |
这是根据cclass,做了一个分区,进行了一个汇总。
你会发现,没有orderby的话 永远都是汇总,是不会去做累加的。
select class, score, sum(score) over(partipion by class order by id) as sum from table
这个的意思是根据class 分组,在根据id进行排序,进行做累加。
score | class | sum |
---|---|---|
20 | 1 | 20 |
40 | 1 | 60 |
50 | 2 | 50 |
10 | 2 | 60 |
70 | 3 | 70 |
这边给大家介绍一个 关于sum() over() 非常好用的一个实际应用场景。
name | amount | monthstr |
---|---|---|
a | 100 | 202401 |
a | 200 | 202402 |
a | 100 | 202403 |
a | 400 | 202404 |
需求,我要求a这个人每个月的累计值,也就是说202404 的累计值 是要把202401 到 202404的所有值都加起来
select name ,amount ,monthstr, sum(amount) over(order by monthstr) as sumamount from table
name | amount | monthstr | sumamount |
---|---|---|---|
a | 100 | 202401 | 100 |
a | 200 | 202402 | 300 |
a | 100 | 202403 | 400 |
a | 400 | 202404 | 800 |
讲到这sum() over() 你应该是了解了吧,
只要是遇到 需要分区做汇总,或者是要做逐级累加的,就需要这个开窗函数来帮你。
不过对于数据库的版本需要注意下,像mysql,8以上是支持的,5就不支持拉了。