语法 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> SELECT *,SUM(k) OVER(PARTITION BY i ORDER BY j DESC) 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 降序排列,从每组的第一个值开 GBase UP 产品手册 5 数据库管理指南 文档版本04(2021-04-21) 南大通用数据技术股份有限公司 583 始向后累加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 FROM 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 | | 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。