SUM OVER 函数
语法
SUM([DISTINCT/ALL] expr) OVER([PARTITION BY …]
[ORDER BY …
[ASC/DESC] ])
功能描述
计算组内表达式的移动累加和。
示例
示例1:SUM(k) OVER(PARTITION BY i ORDER BY j DESC)
gbase> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected
gbase> CREATE TABLE t1(i int, j int,k int);
Query OK, 0 rows affected
gbase> INSERT INTO t1 VALUES(2,1,4), (2,3,6),(2,3,4),(2,5,8), (3,2,2),(3,2,
4), (3,2,2),(3,4,6),(3,1,2),(3,5,8);
Query OK, 10 rows affected
Records: 10
Duplicates: 0
Warnings: 0
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
895
gbase> SELECT *,SUM(k) OVER(PARTITION BY i ORDER BY j DES
C) AS sum FROM t1;
+------+------+------+------+
| i
| j
| k
| sum
|
+------+------+------+------+
|
2 |
5 |
8 |
8 |
|
2 |
3 |
4 |
18 |
|
2 |
3 |
6 |
18 |
|
2 |
1 |
4 |
22 |
|
3 |
5 |
8 |
8 |
|
3 |
4 |
6 |
14 |
|
3 |
2 |
2 |
22 |
|
3 |
2 |
4 |
22 |
|
3 |
2 |
2 |
22 |
|
3 |
1 |
2 |
24 |
+------+------+------+------+
10 rows in set
用例分析:首先会根据i 分组,在同组内,根据j 降序排列,从每组的第一个值
开始向后累加k 值,相同的j 值,对应的累加和相同,都是加到最后一个j 值对
应的k 值,如果遇到不同组,从0 开始重新累加。
注意
NULL 值的处理方式同聚合函数sum 类似,如果全为NULL 值,则
结果为NULL,否则NULL 不进行累加。
以i 值为2、2、2、2,j 值为5、3、3、1,K 值为8、4、6、4,sum 值为8、18、
18、22 为例,i=2,j=5,k=8 时,sum=8,i=2,j=3,k=4 以及i=2,j=3,k=6 时,
因为j 值相同,所以sum 值相同,计算过程为sum = 8 + 4 + 6 = 18。
示例2:SUM(distinct k) OVER(PARTITION BY i)
gbase> SELECT *,SUM(distinct k) OVER(PARTITION BY i) AS sum F
ROM t1;
+------+------+------+------+
| i
| j
| k
| sum
|
+------+------+------+------+
|
2 |
3 |
6 |
18 |
|
2 |
3 |
4 |
18 |
|
2 |
5 |
8 |
18 |
|
2 |
1 |
4 |
18 |
|
3 |
2 |
2 |
20 |
|
3 |
2 |
4 |
20 |
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
896
|
3 |
2 |
2 |
20 |
|
3 |
4 |
6 |
20 |
|
3 |
1 |
2 |
20 |
|
3 |
5 |
8 |
20 |
+------+------+------+------+
10 rows in set
用例分析:首先根据i 分组,由于没有ORDER BY 部分,则同组内的累加和都相
等,将同组内的不重复的k 值进行累加,如果遇到不同组,从0 重新开始。
以i 值为2、2、2、2,j 值为5、3、3、1,k 值为8、4、6、4,sum 值为18、18、
18、18 为例,因为在这4 组数值中,不同的k 值为6、4、8,所以sum= 6 + 4 + 8
= 18。