GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 895 关键字说明: Rows 指定行的范围 Range 指定值的范围 Unbounded 无限 Preceding 向上,减去,提前 Following 向下,加上,延后 Current row 当前行 示例: 表结构:create table t(a int,b int,c int,d datetime); 示例以a 列数据分组, 以b 列或者d 列数据排序, 输出同一分组内开窗子句指定范 围的c 列累加和sum(c) 需提前打开支持子句的控制参数: set _t_gbase_new_window_function_support=1 示例1:指定行范围的窗口,从当前行的前一行,到当前行。 gbase> select a,b,c,sum(c)over(partition by a order by b,c rows between 1 preceding and current row) as 'sum(c)' from t; +------+------+------+--------+ | a | b | c | sum(c) | +------+------+------+--------+ | 2 | 1 | 1 | 1 | | 2 | 2 | 1 | 2 | | 1 | 1 | 2 | 2 | | 1 | 2 | 4 | 6 | | 1 | 3 | 5 | 9 | +------+------+------+--------+ 5 rows in set (Elapsed: 00:00:00.21) 示例2:指定行范围的窗口,从当前行的前一行,到当前行的后一行。 gbase> select a,b,c,sum(c)over(partition by a order by b,c rows between 1 preceding and 1 following) as 'sum(c)' from t; +------+------+------+--------+ | a | b | c | sum(c) | +------+------+------+--------+ | 2 | 1 | 1 | 2 | | 2 | 2 | 1 | 2 | | 1 | 1 | 2 | 6 |
GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 896 | 1 | 2 | 4 | 11 | | 1 | 3 | 5 | 9 | +------+------+------+--------+ 5 rows in set (Elapsed: 00:00:00.07) 示例3: 指定值范围的窗口, 当前行数值列 (b列) 的值为x, 窗口为b列值在[ (x-2),x ] 闭区间范围,输出同组该范围内c 列的累加和。 gbase> select a,b,c,sum(c)over(partition by a order by b range between 2 preceding and current row) as 'sum(c)' from t; +------+------+------+--------+ | a | b | c | sum(c) | +------+------+------+--------+ | 2 | 1 | 1 | 1 | | 2 | 2 | 1 | 2 | | 1 | 1 | 2 | 2 | | 1 | 2 | 4 | 6 | | 1 | 3 | 5 | 11 | +------+------+------+--------+ 5 rows in set (Elapsed: 00:00:00.10) 示例4: 指定值范围的窗口, 当前行的日期列d 日期值为x, 窗口为d 列日期值在[ x 的前2 天,x 的后3 天] 闭区间的范围,输出同组该范围内c 列的累加和。 gbase> select a,d,c,sum(c)over(partition by a order by d range between 2 preceding and 3 following) as 'sum(c)' from t; +------+---------------------+------+--------+ | a | d | c | sum(c) | +------+---------------------+------+--------+ | 2 | 2010-10-10 10:00:00 | 1 | 2 | | 2 | 2010-10-10 10:01:00 | 1 | 2 | | 1 | 2010-10-08 10:00:00 | 2 | 6 | | 1 | 2010-10-11 06:00:00 | 4 | 9 | | 1 | 2010-10-12 10:00:00 | 5 | 9 | +------+---------------------+------+--------+ 5 rows in set (Elapsed: 00:00:00.36) 示例5: 指定值范围的窗口, 当前行的日期列d日期值为x, 窗口为d列日期值在[ 行 首,x 的后3 分钟] 闭区间的范围,输出同组该范围内c 列的累加和。 gbase> select a,d,c,sum(c)over(partition by a order by d range between unbounded preceding and interval 3 minute following) as 'sum(c)' from t; +------+---------------------+------+--------+ | a | d | c | sum(c) | +------+---------------------+------+--------+ | 1 | 2010-10-08 10:00:00 | 2 | 2 | | 1 | 2010-10-11 06:00:00 | 4 | 6 |
GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 897 | 1 | 2010-10-12 10:00:00 | 5 | 11 | | 2 | 2010-10-10 10:00:00 | 1 | 2 | | 2 | 2010-10-10 10:01:00 | 1 | 2 | +------+---------------------+------+--------+ 5 rows in set (Elapsed: 00:00:00.07) 使用约束: 1. _t_gbase_new_window_function_support 参数为控制支持windowing_clause 子句的参数,参数值默认为0,不支持windowing_clause 子句,设置为1 时支持 windowing_clause 子句。 set _t_gbase_new_window_function_support=1 2. 不支持windowing_clause 子句情况下,开窗方式是固定的,范围是: Range between unbounded preceding and current row 3. Partition 子句为空,则不分组,即说明全部数据为一组;order by 子句为 空,则每个分组中的所有数据不排序,即一个分组就是一个“子窗口”。 4. between bound1 and bound2 bound1 定义窗口的起始位置,bound2 定义窗口的结束位置。 单独一个bound 时,为起始位置的定义,结束位置默认为current row,如: select a,b,c,sum(c)over(partition by a order by b range 2 preceding) as 'sum(c)' from t; 5. unbounded preceding 指明起始位置,即当前分组中的行首,不能出现在bound2 中。 6. unbounded following 指明结束位置,即当前分组中的行尾,不能出现在bound1 中。 7. current row 指明起始或结束位置为当前行。 8. 在如下情况时,order by 关键字后可以有多个表达式: Range between unbounded preceding and current row Range between unbounded preceding and unbounded following Range between current row and current row
GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 898 Range between current row and unbounded following 9. value_expr preceding | value_expr following 起始位置为value_expr following 时,则结束位置应为value_expr following; 结束位置为value_expr preceding 时,则起始位置应为value_expr preceding。 10. rows 关键字后接value_expr 时,不支持interval 子句 value_expr 为num 时,标识了行的偏移量,为数值常量,正整数(四舍五入)。 不可为负数、数值函数、表列。 11. range 关键字后接value_expr 时支持interval 子句,且order by 后只能有一 个表达式: value_expr 为num 时,order by 后的表达式只能为数值或日期(时间)类型; value_expr 为interval 子句时,order by 后的表达式只能为日期(时间)类型; value_expr 为num 时,标识了行的偏移量,为数值常量,正整数(四舍五入)。 不可为负数、数值函数、表列。 12. range 关键字,order by 后接唯一表达式用于计算窗口范围时: 排序存在null 值且在行首时,除非unbounded preceding,该行不计入窗口范围; 排序存在null 值且在行尾时,除非unbounded following,该行不计入窗口范围; 当前行为null 值,除非unbounded preceding/following,窗口范围仅为该行。 13. 日期(时间)类型的支持范围:date、datetime 和timestamp。