返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

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。

将一个新列添加到表的最后一列,在分区列之前。目前仅支持非分区表增加列,且

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 645
不允许修改列类型、名称。
语法格式
ALTER TABLE table_name [PARTITION partition_spec]
ADD COLUMNS (col_name data_type [COMMENT col_comment], ...)
[CASCADE|RESTRICT]

table_name:表名称

PARTITION partition_spec:分区名称,添加此参数后,则只修改此分区中的列
属性

col_name:新的列名

data_type:列数据类型

COMMENT col_comment:注释信息

FIRST|AFTER column_name:将修改的列放在指令列之前或之后

CASCADE|RESTRICT:在修改列名、列数据类型时,设置此参数。设置为
CASCADE 时,不但修改表的元数据,还会将所有分区中此列的元数据一起修
改。
设置为RESTRICT 时,
列的修改仅限制在表的元数据。
默认为RESTRICT。

示例
示例1:添加类型为 int 的 d 列到 test_change 表中
gbase> CREATE TABLE test_change (a int, b int, c int) ENGINE='HIVE';
Query OK, 0 rows affected
gbase> ALTER TABLE test_change ADD COLUMN d int;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC test_change;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| b | int(11) | YES | | NULL | |
| c | int(11) | YES | | NULL | |
| d | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
4 rows in set

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 646

demo1.ec 程序演示了本节呈现的大多数概念,例如:include 文件、标识符、主机变量以
及嵌入式 SQL 语句。
它演示如何使用头文件、
声明以及使用主机变量和嵌入式 SQL 语句。

重要: 如果使用 UNIX™,可以在 $GBASEDBTDIR/demo/esqlc 目录下找到本版的联机
以及其它演示程序。如果使用 Windows™,可以在 %GBASEDBTDIR%\demo\esqldemo 目
录下找到此程序。
编译 demo1 程序
使用下列命令编译 demo1 程序:esql demo1.ec
在 UNIX™ 中,可执行程序的名称缺省为 a.out。
在 Windows™ 环境中,可执行程序的名称缺省为 demo.exe。
可以使用 -o 选项对可执行程序指定不同的名称。
demo1.ec 文件指南
GBase 8s ESQL/C 程序样本 demo1.ec 使用静态 SELECT 语句。
这意味着在编译时程序可
以获得它需要运行 SELECT 语句的所有信息。
1. #include
2. EXEC SQL define FNAME_LEN 15;
3. EXEC SQL define LNAME_LEN 15;
4. main()

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 40 -
5. {
6. EXEC SQL BEGIN DECLARE SECTION;
7. char fname[ FNAME_LEN + 1 ];
8. char lname[ LNAME_LEN + 1 ];
9. EXEC SQL END DECLARE SECTION;
第 1 行
#include 语句告诉 C 预处理程序包含来自 /usr/include 目录下的 stdio.h 系统头文。
stdio.h 文件使 demo1 使用标准 C 语言 I/O 库。
第 2 - 3 行
GBase 8s ESQL/C 处理预处理阶段 1 中的 define 指令。该指令定义定义 FNAME_LEN
和 LNAME_LEN 常量,程序在主机变量的声明中使用它们。
第 4 - 9 行
第 4 行开始 main() 函数,该程序的入口点。EXEC SQL 块声明 main() 函数本地的主机
变量,它从 customer 表的 fname 和 lname 列接收数据。每个数组的长度大于其接收
数据的字符列的长度的 1 个字符。额外的字节存储空终止符。
10. printf( "DEMO1 Sample ESQL Program running.\n\n");
11. EXEC SQL WHENEVER ERROR STOP;
12. EXEC SQL connect to 'stores7';
13. EXEC SQL DECLARE democursor cursor for
14. select fname, lname
15. into :fname, :lname
16. from customer
17. where lname < 'C';
18. EXEC SQL open democursor;
第 10 - 12 行
printf() 函数显示用于标识的文本,并在程序开始执行时通知用户。WHENEVER 语句实现
最少的错误处理,导致程序显示错误编号,并在数据库服务器处理 SQL 语句后返回错误
时终止。CONNECT 语句发起与缺省数据库服务器的连接,并打开 stores7 演示数据库。
您可以在 GBASEDBTSERVER 环境变量中指定缺省数据库服务器,必须在应用程序连接
任何数据库服务器之前设置。
第 13 - 17 行
DECLARE 语句创建名为 democursor 的游标,
来管理数据库服务器从 customer 表读
取的行。DECLARE 语句中的 SELECT 语句确定数据库服务器从该表读取的数据的类型。
此 SELECT 语句读取姓氏(lname)以小于 'C' 的字母开头的那些客户的第一个和家族
姓名。
第 18 行
OPEN 语句打开 democursor 游标并开始执行 SELECT 语句。
19. for (;;)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 41 -
20. {
21. EXEC SQL fetch democursor;
22. if (strncmp(SQLSTATE, "00", 2) != 0)
23. break;
24. printf("%s %s\n",fname, lname);
25. }
26. if (strncmp(SQLSTATE, "02", 2) != 0)
27. printf("SQLSTATE after fetch is %s\n", SQLSTATE);
28. EXEC SQL close democursor;
29. EXEC SQL free democursor;
第 19 - 25 行
本节代码在循环中执行 FETCH 语句并重复,
直到 SQLSTATE 不等于 "00"。
该条件表示
数据结束条件或发生运行错误。在此循环中每个迭代中, FETCH 语句使用游标
democursor 检索 SELECT 语句返回的下一行并将选择的行放到主机变量 fname 和
lname中。数据库服务器每次成功获取行后都将 SQLSTATE 的状态变量设置为 "00" 。
如果数据结束的条件发生,则数据库服务器将 SQLSTATE 设置为 "02";如果发生错误,
则将 SQLSTATE 设置为比 "02" 大的值。
第 26 - 27 行
如果 SQLSTATE 中的类代码是除了 "02" 的任何值,则此用户的 SQLSTATE 值通过
printf() 显示。该输出在运行错误的事件中很有用。
第 28 - 29 行
CLOSE 和 FREE 语句释放为数据库服务器此游标分配的资源。该游标将不再使用。
30. EXEC SQL disconnect current;
31. printf("\nDEMO1 Sample Program over.\n\n");
32. }
第 30 - 32 行
DISCONNECT CURRENT 语句关闭数据库并终止当前对数据库服务器的连接。最后的
printf() 告诉用户程序结束。32 行的右括号(})标识程序 main() 函数的结束。
OPEN 语句打开 democursor 游标并开始执行 SELECT 语句。
19. for (;;)
20. {
21. EXEC SQL fetch democursor;
22. if (strncmp(SQLSTATE, "00", 2) != 0)
23. break;
24. printf("%s %s\n",fname, lname);
25. }
26. if (strncmp(SQLSTATE, "02", 2) != 0)
27. printf("SQLSTATE after fetch is %s\n", SQLSTATE);
28. EXEC SQL close democursor;
29. EXEC SQL free democursor;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 42 -
第 19 - 25 行
本节代码在循环中执行 FETCH 语句并重复,
直到 SQLSTATE 不等于 "00"。
该条件表示
数据结束条件或发生运行错误。在此循环中每个迭代中, FETCH 语句使用游标
democursor 检索 SELECT 语句返回的下一行并将选择的行放到主机变量 fname 和
lname中。数据库服务器每次成功获取行后都将 SQLSTATE 的状态变量设置为 "00" 。
如果数据结束的条件发生,则数据库服务器将 SQLSTATE 设置为 "02";如果发生错误,
则将 SQLSTATE 设置为比 "02" 大的值。
第 26 - 27 行
如果 SQLSTATE 中的类代码是除了 "02" 的任何值,则此用户的 SQLSTATE 值通过
printf() 显示。该输出在运行错误的事件中很有用。
第 28 - 29 行
CLOSE 和 FREE 语句释放为数据库服务器此游标分配的资源。该游标将不再使用。
30. EXEC SQL disconnect current;
31. printf("\nDEMO1 Sample Program over.\n\n");
32. }
第 30 - 32 行
DISCONNECT CURRENT 语句关闭数据库并终止当前对数据库服务器的连接。最后的
printf() 告诉用户程序结束。32 行的右括号(})标识程序 main() 函数的结束。