数据库sum() over() 详解

2024-07-12 12:36:40 浏览数 (2)

前言

开窗函数很重要,一定要好好学,能够解决不少场景下的需求。

这是举例子的一张表

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就不支持拉了。

0 人点赞