华为云用户手册

  • 什么是SQL SQL是用于访问和处理数据库的标准计算机语言。 SQL提供了各种任务的语句,包括: 查询数据。 在表中插入、更新和删除行。 创建、替换、更改和删除对象。 控制对数据库及其对象的访问。 保证数据库的一致性和完整性。 SQL语言由用于处理数据库和数据库对象的命令和函数组成。该语言还会强制实施有关数据类型、表达式和文本使用的规则。因此在SQL参考章节,除了SQL语法参考外,还会看到有关数据类型、表达式、函数和操作符等信息。
  • 条件表达式 在执行SQL语句时,可通过条件表达式筛选出符合条件的数据。 条件表达式主要有以下几种: CASE CASE表达式是条件表达式,类似于其他编程语言中的CASE语句。 CASE表达式的语法图请参考图1。 图1 case::= CASE子句可以用于合法的表达式中。condition是一个返回BOOLEAN数据类型的表达式: 如果结果为真,CASE表达式的结果就是符合该条件所对应的result。 如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。 如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE TABLE tpcds.case_when_t1(CW_COL1 INT) DISTRIBUTE BY HASH (CW_COL1); INSERT INTO tpcds.case_when_t1 VALUES (1), (2), (3); SELECT * FROM tpcds.case_when_t1; cw_col1 --------- 3 1 2 (3 rows) SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two' ELSE 'other' END FROM tpcds.case_when_t1; cw_col1 | case ---------+------- 3 | other 1 | one 2 | two (3 rows) DROP TABLE tpcds.case_when_t1; DECODE DECODE的语法图请参见图2。 图2 decode::= 将表达式base_expr与后面的每个compare(n) 进行比较,如果匹配返回相应的value(n)。如果没有发生匹配,则返回default。 示例请参见条件表达式函数。 1 2 3 4 5 SELECT DECODE('A','A',1,'B',2,0); case ------ 1 (1 row) COALESCE COALESCE的语法图请参见图3。 图3 coalesce::= COALESCE返回它的第一个非NULL的参数值。如果参数都为NULL,则返回NULL。它常用于在显示数据时用缺省值替换NULL。和CASE表达式一样,COALESCE只计算用来判断结果的参数,即在第一个非空参数右边的参数不会被计算。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE tpcds.c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10)) DISTRIBUTE BY HASH (last_value); INSERT INTO tpcds.c_tabl VALUES('abc', 'efg', '123'); INSERT INTO tpcds.c_tabl VALUES(NULL, 'efg', '123'); INSERT INTO tpcds.c_tabl VALUES(NULL, NULL, '123'); SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM tpcds.c_tabl ORDER BY 1, 2, 3, 4; description | short_description | last_value | coalesce -------------+-------------------+------------+---------- abc | efg | 123 | abc | efg | 123 | efg | | 123 | 123 (3 rows) DROP TABLE tpcds.c_tabl; 如果description不为NULL,则返回description的值,否则计算下一个参数short_description;如果short_description不为NULL,则返回short_description的值,否则计算下一个参数last_value;如果last_value不为NULL,则返回last_value的值,否则返回(none)。 1 2 3 4 5 SELECT COALESCE(NULL,'Hello World'); coalesce --------------- Hello World (1 row) NULLIF NULLIF的语法图请参见图4。 图4 nullif::= 只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE tpcds.null_if_t1 ( NI_VALUE1 VARCHAR(10), NI_VALUE2 VARCHAR(10) ) DISTRIBUTE BY HASH (NI_VALUE1); INSERT INTO tpcds.null_if_t1 VALUES('abc', 'abc'); INSERT INTO tpcds.null_if_t1 VALUES('abc', 'efg'); SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM tpcds.null_if_t1 ORDER BY 1, 2, 3; ni_value1 | ni_value2 | nullif -----------+-----------+-------- abc | abc | abc | efg | abc (2 rows) DROP TABLE tpcds.null_if_t1; 如果value1等于value2则返回NULL,否则返回value1。 1 2 3 4 5 SELECT NULLIF('Hello','Hello World'); nullif -------- Hello (1 row) GREATEST(最大值),LEAST(最小值) GREATEST的语法图请参见图5。 图5 greatest::= 从一个任意数字表达式的列表里选取最大的数值。 1 2 3 4 5 SELECT greatest(9000,155555,2.01); greatest ---------- 155555 (1 row) LEAST的语法图请参见图6。 图6 least::= 从一个任意数字表达式的列表里选取最小的数值。 以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。 列表中的NULL值将被忽略。只有所有表达式的结果都是NULL的时候,结果才是NULL。 1 2 3 4 5 SELECT least(9000,2); least ------- 2 (1 row) 示例请参见条件表达式函数。 NVL NVL的语法图请参见图7。 图7 nvl::= 如果value1为NULL则返回value2,如果value1非NULL,则返回value1。 示例: 1 2 3 4 5 SELECT nvl(null,1); nvl ----- 1 (1 row) 1 2 3 4 5 SELECT nvl ('Hello World' ,1); nvl --------------- Hello World (1 row) IF IF的语法图请参见图8。 图8 if::= 当bool_expr为true时,返回expr1,否则返回expr2。 示例请参见条件表达式函数。 IFNULL IFNULL的语法图请参见图9。 图9 ifnull::= 当expr1不为NULL时,返回expr1,否则返回expr2。 示例请参见条件表达式函数。 父主题: 表达式
  • 示例 重建一个单独索引: 1 REINDEX INDEX tpcds.tpcds_customer_index1; 重建表tpcds.customer_t1上的所有索引: 1 REINDEX TABLE tpcds.customer_t1; 重建分区表customer_address分区P1的分区索引: DROP TABLE IF EXISTS customer_address; CREATE TABLE customer_address ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE(ca_address_sk) ( PARTITION P1 VALUES LESS THAN(2450815), PARTITION P2 VALUES LESS THAN(2451179), PARTITION P3 VALUES LESS THAN(2451544), PARTITION P4 VALUES LESS THAN(MAXVALUE) ); CREATE INDEX customer_address_index on customer_address(CA_ADDRESS_SK) LOCAL; REINDEX TABLE customer_address PARTITION P1;
  • 语法格式 重建全库索引或者系统表的索引。 1 REINDEX { DATABASE | SYSTEM } name [ FORCE ]; 重建普通索引或者普通表上的索引。 1 REINDEX { INDEX | TABLE } name [ FORCE | WITHOUT UNUSABLE ] 重建索引分区或者分区上的索引。 1 2 REINDEX { | TABLE} name PARTITION partition_name [ FORCE | WITHOUT UNUSABLE ];
  • 参数说明 INDEX 重新建立指定的索引。 TABLE 重新建立指定表的所有索引,如果表有从属的"TOAST"表,则这个表也会重建索引。 DATABASE 重建当前数据库里的所有索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 无效选项,会被忽略。 WITHOUT UNUSABLE 指定该参数时,在REINDEX时会忽略对象上的UNUSABLE索引或者UNUSABLE索引分区。该参数仅8.3.0.100及以上集群版本支持。 partition_name 需要重建索引的分区的名字或者索引分区的名字。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引分区的名字; 如果前面是REINDEX TABLE,则这里应该指定分区的名字; REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
  • 示例 add_clause子句用于为指定的分区表添加一个或多个分区。 为范围分区表customer_address增加分区ca_address_sk介于700和900之间: 1 ALTER TABLE customer_address ADD PARTITION P5 VALUES LESS THAN (900); 为范围分区表customer_address增加分区: [5000, 5300), [5300, 5600), [5600, 5900), [5900, 6000): 1 ALTER TABLE customer_address_SE ADD PARTITION p6 START(5000) END(6000) EVERY(300); 为范围分区表customer_address增加MAXVALUE分区p6: 1 ALTER TABLE customer_address ADD PARTITION p6 END(MAXVALUE); 为列表分区表增加分区P6: 1 ALTER TABLE data_list ADD PARTITION P6 VALUES (202302,202303); modify_clause子句用于设置分区索引是否可用。 给分区表customer_address创建LOCAL索引student_grade_index,并指定分区的索引名称: 1 2 3 4 5 6 7 8 9 CREATE INDEX customer_address_index ON customer_address(ca_address_id) LOCAL ( PARTITION P1_index, PARTITION P2_index, PARTITION P3_index, PARTITION P4_index, PARTITION P5_index, PARTITION P6_index ); 重建分区表customer_address中分区P1上的所有索引: 1 ALTER TABLE customer_address MODIFY PARTITION P1 REBUILD UNUSABLE LOCAL INDEXES; 设置分区表customer_address的分区P3上的所有索引不可用: 1 ALTER TABLE customer_address MODIFY PARTITION P3 UNUSABLE LOCAL INDEXES; split_clause子句用于把一个分区切割成多个分区。 将范围分区表customer_address的P6分区以1200为分割点切分: 1 ALTER TABLE customer_address SPLIT PARTITION P6 AT(1200) INTO (PARTITION P6a,PARTITION P6b); 将范围分区表customer_address中200所在的分区分割成多个分区: 1 ALTER TABLE customer_address SPLIT PARTITION FOR(200) INTO(PARTITION p_part START(100) END(300) EVERY(50)); 将列表分区表data_list的分区P2分割成p2a和p2b两个分区: 1 ALTER TABLE data_list SPLIT PARTITION P2 VALUES(202210) INTO (PARTITION p2a,PARTITION p2b); exchange_clause子句:把普通表的数据迁移到指定的分区。 下面示例演示了把一个普通表math_grade数据迁移到分区表student_grade 中分区(math)的操作。创建分区表student_grade : 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE student_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ) PARTITION BY LIST(subject) ( PARTITION gym VALUES('gymnastics'), PARTITION phys VALUES('physics'), PARTITION history VALUES('history'), PARTITION math VALUES('math') ); 添加数据到分区表student_grade中: 1 2 3 4 5 6 7 INSERT INTO student_grade VALUES ('Ann', 20220101, 75, 'gymnastics'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'history'), ('Jann', 20220107, 82, 'physics'), ('Molly', 20220104, 91, 'physics'), ('Sam', 20220105, 72, 'math'); 查询分区表student_grade的math分区记录: 1 2 3 4 5 6 SELECT * FROM student_grade PARTITION (math); stu_name | stu_no | grade | subject ----------+----------+-------+--------- Jeck | 20220103 | 60 | math Sam | 20220105 | 72 | math (2 rows) 创建一个与分区表student_grade定义匹配的普通表math_grade: 1 2 3 4 5 6 7 CREATE TABLE math_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ); 添加了数据到表math_grade中。数据与分区表student_grade的math分区的分区规则一致: 1 2 3 4 5 INSERT INTO math_grade VALUES ('Ann', 20220101, 75, 'math'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'math'), ('Jann', 20220107, 82, 'math'); 将普通表math_grade数据迁移到分区表student_grade 中分区(math): 1 ALTER TABLE student_grade EXCHANGE PARTITION (math) WITH TABLE math_grade; 对分区表student_grade的查询表明表math_grade中的数据已和分区math中的数据交换: 1 2 3 4 5 6 7 8 SELECT * FROM student_grade PARTITION (math); stu_name | stu_no | grade | subject ----------+----------+-------+--------- Anna | 20220108 | 56 | math Jeck | 20220103 | 60 | math Ann | 20220101 | 75 | math Jann | 20220107 | 82 | math (4 rows) 对表math_grade的查询显示了之前存储在分区math中的记录已被移动到表student_grade中: 1 2 3 4 5 6 SELECT * FROM math_grade; stu_name | stu_no | grade | subject ----------+----------+-------+--------- Jeck | 20220103 | 60 | math Sam | 20220105 | 72 | math (2 rows) truncate_partitioned_clause子语法用于清理表分区的数据。 清空表student_grade分区p1: 1 ALTER TABLE student_grade TRUNCATE PARTITION p1; row_clause子句用于设置分区表的行迁移开关。 打开分区表customer_address的迁移开关: 1 ALTER TABLE customer_address ENABLE ROW MOVEMENT; merge_clause子句用于把多个分区合并成一个分区。 将范围分区表customer_address的P2,P3两个分区合并为一个分区: 1 ALTER TABLE customer_address MERGE PARTITIONS P2, P3 INTO PARTITION P_M; drop_clause子句用于删除分区表中的指定分区。 删除分区表customer_address的分区P6: 1 ALTER TABLE customer_address DROP PARTITION P6; 删除分区表customer_address的多个分区P3,P4,P5: 1 ALTER TABLE customer_address DROP PARTITION P3, P4, P5;
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 partition_name 分区名。 取值范围:已存在的分区名。 partition_value 分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个分区。 取值范围:需要进行重命名的分区的分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 WITHOUT UNUSABLE 重建该分区上的索引时,忽略UNUSABLE状态的索引。该参数仅8.3.0.100及以上集群版本支持。 ENABLE/DISABLE ROW MOVEMENT 行迁移开关。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是关闭状态。 ENABLE ROW MOVEMENT开启则允许跨分区更新,但此时如果有SELECT FOR UPDATE查询该分区表并发执行,存在查询结果瞬时不一致的可能性,需要谨慎使用。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名字。 取值范围:字符串,要符合标识符的命名规范。
  • 语法格式 修改表分区主语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何, GaussDB (DWS)总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 1 2 3 4 5 6 7 8 9 modify_clause | rebuild_clause | exchange_clause | row_clause | merge_clause | split_clause | add_clause | drop_clause | truncate_partitioned_clause modify_clause子语法用于设置分区索引是否可用。 1 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } rebuild_clause子语法用来重建分区的索引。该语法仅8.3.0.100及以上集群版本支持。 1 REBUILD PARTITION partition_name [ WITHOUT UNUSABLE ] exchange_clause子语法用于把普通表的数据迁移到指定的分区。 1 2 3 EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] 进行交换的普通表和分区表必须满足如下条件: 普通表和分区表的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息、已删除字段的数据类型等。 普通表和分区表的表压缩信息严格一致。 普通表和分区表的分布列信息严格一致。 普通表和分区表的索引个数相同,且对应索引的信息严格一致。 普通表和分区表的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表和unlogged表。 普通表和分区表应该在同一个逻辑集群或节点组(NodeGroup)中,如果不在同一个逻辑集群或节点组,将会采用将数据插入对方表内方式来实现交换分区,这样交换分区的时间与表数据量有关,对于数据量非常大的表和分区表,交换分区将会非常耗时。 在在线扩容重分布场景下,如果普通表和分区表正在重分布,交换分区语句有可能中断正在重分布的普通表或分区表(取决于交换分区和重分布语句是否产生锁冲突),通常重分布的普通表或分区表被中断后会重试2次,但同一个表交换分区执行过于频繁可能导致普通表或分区表多次重试重分布都失败。如果普通表重分布过程被交换分区操作打断,在重试重分布时,数据已经被替换为原分区表中的数据,会重新进行全量重分布。 如果行存分区表中最后一个有效字段后的其他字段全部被删除,在不考虑这些删除字段的情况下,分区表与普通表字段信息一致时,分区表和普通表可以进行交换。 列存普通表和列存分区表的表级参数colversion必须一致:禁止colversion2.0与colversion1.0执行交换分区操作。 完成交换后,普通表和分区表的数据被置换,同时普通表和分区表的表空间信息被置换。此时,普通表和分区表的统计信息变得不可靠,需要对普通表和分区表重新执行analyze。 row_clause子语法用于设置分区表的行迁移开关。 1 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。 1 MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name INTO关键字前的分区称为源分区,INTO关键字后的分区称为目标分区。 源分区个数不能小于2个。 源分区名称不能重复。 源分区不能存在unusable的索引,否则执行会报错。 目标分区名只能跟最后一个源分区的名称相同,或者跟表的所有分区名都不相同。 目标分区的边界是所有源分区边界的并集。 对于范围分区表,所有的源分区必须是边界连续的分区。 对于列表分区,如果源分区中包含DEFAULT分区,那么目标分区的边界也是DEFAULT。 split_clause子语法用于把一个分区切割成多个分区。 范围分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } 指定切割点split_point_clause的语法为: 1 AT ( partition_value ) INTO ( PARTITION partition_name , PARTITION partition_name ) 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 不指定切割点no_split_point_clause的语法为。 1 INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) } 不指定切割点的方式,partition_less_than_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_less_than_item指定的最后一个分区的分区键要等于正在被切割的分区的分区键大小。 不指定切割点的方式,partition_start_end_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_start_end_item指定的最后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区键。 partition_less_than_item支持的分区键个数最多为4,而partition_start_end_item仅支持1个分区键,其支持的数据类型参见Partition Key。 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。 分区项partition_less_than_item的语法为: 1 2 PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) 分区项partition_start_end_item的语法为,其约束参见START END语法描述。 1 2 3 4 5 6 PARTITION partition_name { {START(partition_value) END (partition_value) EVERY (interval_value)} | {START(partition_value) END ({partition_value | MAXVALUE})} | {START(partition_value)} | {END({partition_value | MAXVALUE})} } 列表分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_values_clause | split_no_values_clause } 指定切割点的split_values_clause的语法为: 1 VALUES ( { (partition_value) [, ...] } | DEFAULT } ) INTO ( PARTITION partition_name , PARTITION partition_name ) 如果源分区不是DEFAULT分区,那么切割点所指定的边界是源分区边界的一个非空真子集;如果源分区是DEFAULT分区,那么切割点所指定的边界不能和其它非DEFAULT分区的边界存在重叠。 切割点的指定的边界是INTO关键字后面的第一个分区的边界,源分区边界与切割点的指定的边界的差集是第二个分区的边界。 当源分区是DEFAULT分区时,第二个分区的边界还是DEFAULT。 不指定切割点的split_no_values_clause的语法为: 1 INTO ( list_partition_item [, ....], PARTITION partition_name ) 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样,除了此处的分区定义中边界值不能为DEFAULT。 除了最后一个分区,其他分区需要显式定义边界,定义的边界不能是DEFAULT,并且必须是源分区边界的非空真子集。最后一个分区的边界是源分区边界与其它分区边界的差集,且最后一个分区的边界为空(即差集不能为空集)。 如果源分区是DEFAULT分区,则最后一个分区的边界为DEFAULT。 add_clause子语法用于为指定的分区表添加一个或多个分区。 范围分区的add_clause语法如下: 1 ADD { partition_less_than_item... | partition_start_end_item } 使用partition_less_than_item语法时,分区表必须是范围分区表,否则执行会报错。 此处partition_less_than_item和创建范围分区表的时候指定分区的语法一样。 当前分区表的最后一个分区的边界为MAXVALUE,不允许添加新的分区,否则执行会报错。 列表分区的add_clause语法如下: 1 ADD list_partition_item 使用list_partition_item语法时,分区表必须是列表分区表,否则执行会报错 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样 当前分区表存在DEFAULT分区时,不允许添加新的分区动作,否则执行会报错 drop_clause子语法用于删除分区表中的指定分区。 1 DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } drop_clause子语法支持删除多个分区语法。(8.1.3.100及以上集群版本支持。) 1 DROP PARTITION { partition_name [, ... ] } truncate_partitioned_clause子语法用于清理表分区的数据。 1 TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } ; 使用PARTITION FOR子句时,partition_value所在的整个分区会被清空。 修改表分区名字的语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} RENAME PARTITION { partition_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
  • 注意事项 添加分区的名字不能与该分区表已有分区的名字相同。 对于范围分区表,要添加的分区的边界值要和分区表的分区键的类型一致,且要大于分区表的最后一个分区的上边界。 对于列表分区表,如果已经定义DEFAULT分区,则不能添加新分区。 若文档中未特殊注明,则表明范围分区表和列存分区的语法使用相同。 如果目标分区表中已有分区数达到了最大值(32767),则不能继续添加分区。 当分区表只有一个分区时,不能删除该分区。 删除分区(DROP PARTITION)时会连同分区内数据一起删除。 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 Value分区表不支持相应的Alter Partition操作。 OBS冷热表对于move,exchange,merge,split操作,不支持指定分区表表空间为OBS表空间;执行ALTER语法时,需保持分区数据冷热属性不变(即冷分区操作后为冷分区,热分区操作后为热分区),不支持将冷分区数据切至本地表空间;对于冷分区仅支持默认表空间;merge操作不支持将冷分区与热分区进行合并,exchange操作不支持冷分区交换。
  • pgxc_group_add_subscription(src_vw_name, target_vw_name) 描述:存算分离架构下,逻辑集群(Virtual Warehouse,以下简称VW)之间建立KV订阅关系,建立了订阅关系之后,消费者VW的KVcahce会定期的从生产者的obs cudesc快照目录增量同步sst文件到本地,后续就可以支持在消费者VM中跨VW查询生产者VW中的表。 创建的订阅关系可以在pgxc_group_subscription表中查询到记录。该函数仅9.0.3及以上集群版本支持。 返回值类型:void 返回信息如下: 表1 pgxc_group_add_subscription(src_vw_name, target_vw_name)返回字段 名称 类型 描述 src_vw_name text 生产者VW名称,通常作为写入数据的VW。 target_vw_name text 消费者VW名称,通常作为读取数据的VW。 示例: 1 2 3 4 5 SELECT pgxc_group_add_subscription('write_group', 'single_read_group'); pgxc_group_add_subscription ------------------ (1 row)
  • pgxc_group_drop_subscription(src_vw_name, target_vw_name) 描述:存算分离架构下,删除VW之间已经建立的KV订阅关系,删除操作是删除pgxc_group_subscription表的记录, 删除KV订阅关系后,消费者VW无法继续跨VW查询生产者VW中的表。该函数仅9.0.3及以上集群版本支持。 返回值类型:void 返回信息如下: 表2 pgxc_group_drop_subscription(src_vw_name, target_vw_name)返回字段 名称 类型 描述 src_vw_name text 生产者VW名称,通常作为写入数据的VW。 target_vw_name text 消费者VW名称,通常作为读取数据的VW。 示例: SELECT pgxc_group_drop_subscription('write_group', 'single_read_group'); pgxc_group_drop_subscription ------------------------------ (1 row)
  • pv_session_chunk_dump(tid int, contextname char(64)) 描述:将指定线程创建的某个内存上下文申请的所有chunk信息打印成文件。 参数tid,表示线程ID;参数contextname,表示内存上下文名称。 返回值类型:boolean 示例: 1 2 3 4 5 SELECT * FROM pv_session_chunk_dump(140472797325280, 'Timezones'); pv_session_chunk_dump ----------------------- t (1 row)
  • pv_session_chunk_detail(tid int, contextname char(64)) 描述:查询指定线程创建的某个内存上下文申请的所有chunk信息。 参数tid,表示线程ID;参数contextname,表示内存上下文名称。 使用该函数需使用pv_session_chunk_dump(tid int, contextname char(64))函数将相关信息打印成文件。 返回值类型:record 示例: 1 2 3 4 5 6 7 8 9 SELECT * FROM pv_session_chunk_detail(140178810990936, 'Timezones'); parent | level | file_name | line_number | chunk_size | requested_number | total_size ------------------+-------+---------------+-------------+------------+------------------+------------ TopMemoryContext | 1 | dynahash.cpp | 158 | 1280 | 2 | 2560 TopMemoryContext | 1 | dynahash.cpp | 158 | 160 | 1 | 160 TopMemoryContext | 1 | dynahash.cpp | 158 | 2560 | 2 | 5120 TopMemoryContext | 1 | localtime.cpp | 1965 | 128 | 1 | 128 TopMemoryContext | 1 | localtime.cpp | 1965 | 448 | 1 | 448 (5 rows)
  • pg_shared_chunk_detail(contextname char(64)) 描述:查询指定共享内存下内存上下文申请的所有chunk信息。 参数contextname,表示内存上下文名称。 使用该函数需先使用pg_shared_chunk_dump(contextname char(64))函数将相关信息打印成文件。 返回值类型:record 示例: 1 2 3 4 5 6 7 8 SELECT * FROM pg_shared_chunk_detail('pgstat file hash table'); parent | level | file_name | line_number | chunk_size | requested_number | total_size ---------------------+-------+--------------+-------------+------------+------------------+------------ pgstat file context | 2 | dynahash.cpp | 158 | 2048 | 1 | 2048 pgstat file context | 2 | dynahash.cpp | 158 | 256 | 1 | 256 pgstat file context | 2 | dynahash.cpp | 158 | 4096 | 9 | 36864 pgstat file context | 2 | dynahash.cpp | 158 | 8192 | 4 | 32768 (4 rows)
  • pg_shared_chunk_dump(contextname char(64)) 描述:将指定共享内存下内存上下文申请的所有chunk信息打印成文件。 参数contextname,表示内存上下文名称。 返回值类型:boolean 示例: 1 2 3 4 5 SELECT * FROM pg_shared_chunk_dump('pgstat file hash table'); pg_shared_chunk_dump ---------------------- t (1 row)
  • pg_get_external_schema_table_col(text, text) 描述:获取external schema表的列信息。 入参: 第一个入参为external schema名称,第二个入参为表名称。 返回值类型:setof record 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 SELECT * FROM pg_get_external_schema_table_col('ex_lf', 'test_lf'); col_name | col_type | part_col ------------------------+---------------+---------- field_smallint | smallint | f field_int | int | f field_integer | int | f fileld_bigint | bigint | f field_float | float | f field_double | double | f field_double_precision | double | f field_decimal | decimal(10,0) | f field_numeric | decimal(10,0) | f field_timestamp | timestamp | f field_date | date | f field_varchar | varchar(5) | f field_char | char(5) | f field_boolean | boolean | f field_string | string | f (15 rows)
  • pg_get_external_schema_table_options(text, text) 描述:获取external schema表的option。 入参: 第一个入参为external schema名称,第二个入参为表名称。 返回值类型:setof record 示例: 1 2 3 4 5 6 7 SELECT * FROM pg_get_external_schema_table_options('ex_lf', 'test_lf'); option_name | option_value -------------+------------------------------------ encoding | utf8 format | parquet foldername | /***/***/*** (3 rows)
  • pg_rm_scan_residualfiles_archive() 描述:用于删除当前节点所有归档的残留文件记录。该函数为实例级函数,与当前所在的数据库无关,可以在任意实例上运行。 返回类型:record 返回信息如下: 表7 返回字段 名称 类型 描述 count bigint 归档中已删除的残留文件数量。本地路径的残留文件统计所删除的文件数,OBS路径的残留文件统计所删除的表目录数量。 size bigint 归档中已删除的残留文件总大小,单位为byte。OBS路径的残留文件该项均为0。 示例: 1 2 3 4 5 SELECT * FROM pg_rm_scan_residualfiles_archive(); count | size -------+------- 4 | 81920 (1 row)
  • pgxc_rm_scan_residualfiles_archive(query_flag) 描述:pg_rm_scan_residualfiles_archive()的CN统一执行函数。该函数为集群级函数,与当前所在的数据库无关,在CN实例上运行。 参数query_flag,参数类型int,用于表示执行范围。1表示CN,2表示主DN,4表示备DN,通过或运算可以得到查询并集,如1|2=3表示CN+主DN,1|2|4=7表示CN+主DN+备DN。默认值是7。 返回类型:record 返回信息如下: 表8 返回字段 名称 类型 描述 nodename name 节点名称。 instance_id text 实例名称。 count bigint 归档中已删除的残留文件数量。本地路径的残留文件统计所删除的文件数,OBS路径的残留文件统计所删除的表目录数量。 size bigint 归档中已删除的残留文件总大小,单位为byte。OBS路径的残留文件该项均为0。 示例: 1 2 3 4 5 6 7 8 SELECT * FROM pgxc_rm_scan_residualfiles_archive(); node_name | instance_id | count | size --------------+-------------+-------+------- dn_6001_6002 | dn_6001 | 4 | 81920 cn_5001 | cn_5001 | 1 | 40960 dn_6007_6008 | dn_6008 | 1 | 24576 coordinator1 | coordinator1| 1 | 0 (4 rows)
  • pg_archive_scan_residualfiles() 描述:用于归档当前节点所连接数据库上所有扫描到的残留文件记录。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。 返回类型:record 返回信息如下: 表5 返回字段 名称 类型 描述 archive text 归档后的本地文件夹路径。OBS路径的残留文件归档在对应OBS数据库目录下。 count bigint 归档的残留文件数量。 size bigint 归档的残留文件总大小,单位为byte。 示例: 1 2 3 4 5 SELECT * FROM pg_archive_scan_residualfiles(); archive | count | size --------------------------------------------------------------+-------+------- pg_residualfiles/archive/pgscrf_archive_20231027144613791801 | 4 | 81920 (1 row) 此函数只能归档当前登录的数据库中记录过的残留文件,归档时会记录中的残留文件进行相应的校验,校验结果分为以下三种情况: 校验通过:校验通过后会对残留文件进行归档,并标记为已处理。 校验失败:校验失败会跳过归档,并标记为已处理。 延迟校验:延迟校验会跳过归档,通常表示当前未满足校验时机,延迟校验的情况通常和事务完成情况及备机REDO进度有关。 实际归档目录与对应表空间在同一个文件系统下,删除表空间也会删除对应的残留文件归档。 延迟DDL开启后,此函数无法使用。 此函数为重载操作,不支持单节点并发使用,也不建议在业务繁忙和资源负载较高时使用。
  • pgxc_get_scan_residualfiles(query_flag) 描述:pg_get_scan_residualfiles()的CN统一执行函数。该函数为集群级函数,与当前所在的数据库无关,在CN实例上运行。 参数query_flag,参数类型int,用于表示执行范围。1表示CN,2表示主DN,4表示备DN,通过或运算可以得到查询并集,如1|2=3表示CN+主DN,1|2|4=7表示CN+主DN+备DN。默认值是7。 返回类型:record 返回信息如下: 表4 返回字段 名称 类型 描述 nodename name 节点名称。 instance_id text 实例名称。 handled bool 残留文件是否已经被处理,被移动或者被更改。 dbname text 数据库名称。 residualfile text 残留文件路径。 size bigint 文件大小,单位为byte。OBS路径的残留文件该项为0。 inode bigint 残留文件stat信息中的Inode。OBS路径的残留文件该项为0。 atime timestamptz 残留文件stat信息中的Access time。OBS路径的残留文件该项为空。 mtime timestamptz 残留文件stat信息中的Modifie time。OBS路径的残留文件该项为空。 ctime timestamptz 残留文件stat信息中的Chang time。OBS路径的残留文件该项为空。 filepath text 记录残留文件信息的元文件本地路径,对应pgscrf_meta文件。 notes text 注释。
  • pgxc_archive_scan_residualfiles(query_flag) 描述:pg_archive_scan_residualfiles()的CN统一执行函数。该函数为集群级函数,与当前所在的数据库相关,在CN实例上运行。 参数query_flag,参数类型int,用于表示执行范围。1表示CN,2表示主DN,4表示备DN,通过或运算可以得到查询并集,如1|2=3表示CN+主DN,1|2|4=7表示CN+主DN+备DN。默认值是7。 返回类型:record 返回信息如下: 表6 返回字段 名称 类型 描述 nodename name 节点名称。 instance_id text 实例名称。 archive text 归档后的本地文件夹路径。OBS路径的残留文件归档在对应OBS数据库目录下。 count bigint 归档的残留文件数量。 size bigint 归档的残留文件总大小,单位为byte。 示例: 1 2 3 4 5 6 SELECT * FROM pgxc_archive_scan_residualfiles(); node_name | instance_id | archive | count | size --------------+-------------+--------------------------------------------------------------+-------+------- cn_5001 | cn_5001 | pg_residualfiles/archive/pgscrf_archive_20231027145050896440 | 1 | 40960 dn_6007_6008 | dn_6008 | pg_residualfiles/archive/pgscrf_archive_20231027145051018138 | 1 | 24576 (2 rows) 此函数只能归档当前登录的数据库中记录过的残留文件,归档时会记录中的残留文件进行相应的校验,校验结果分为以下三种情况: 校验通过:校验通过后会对残留文件进行归档,并标记为已处理。 校验失败:校验失败会跳过归档,并标记为已处理。 延迟校验:延迟校验会跳过归档,通常表示当前未满足校验时机,延迟校验的情况通常和事务完成情况及备机REDO进度有关。 实际归档目录与对应表空间在同一个文件系统下,删除表空间也会删除对应的残留文件归档。 延迟DDL开启后,此函数无法使用。 此函数为重载操作,不支持单节点并发使用,也不建议在业务繁忙和资源负载较高时使用。
  • pg_scan_residualfiles() 描述:用于扫描当前节点所连接数据库的所有残留文件记录。该函数为库级函数,与当前所在的数据库相关,可以在任意实例上运行。 连接到CN执行时,扫描当前CN节点所在数据库的本地残留文件和OBS全部残留文件。 连接到DN执行时,扫描当前DN节点所在数据库的本地残留文件。 返回类型:record 返回信息如下: 表1 返回字段 名称 类型 描述 pgscrf text 记录残留文件信息的元文件本地路径。 示例: 1 2 3 4 5 6 SELECT * FROM pg_scan_residualfiles(); pgscrf -------------------------------------------------------------------- pg_residualfiles/pgscrf_meta_1663_16323_20231027143716005244 pg_residualfiles/pgscrf_meta_2147484281_16323_20231027143716005713 (2 rows)
  • pgxc_scan_residualfiles(query_flag) 描述:pg_scan_residualfiles()的CN统一执行函数。该函数为集群级函数,与当前所在的数据库相关,在CN实例上运行。 参数说明:query_flag。参数类型int,表示执行范围。1表示CN,2表示主DN,4表示备DN,通过或运算可以得到查询并集,如1|2=3表示CN+主DN,1|2|4=7表示CN+主DN+备DN,默认值是7。 返回类型:record 返回信息如下: 表2 返回字段 名称 类型 描述 nodename name 节点名称。 instance_id text 实例名称。 pgscrf text 记录残留文件信息的元文件本地路径。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 SELECT * FROM pgxc_scan_residualfiles(); node_name | instance_id | pgscrf --------------+-------------+-------------------------------------------------------------------- dn_6001_6002 | dn_6001 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144103839354 dn_6001_6002 | dn_6001 | pg_residualfiles/pgscrf_meta_2147484281_16323_20231027144103839826 cn_5001 | cn_5001 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144103946217 dn_6007_6008 | dn_6008 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144104171311 (4 rows) SELECT * FROM pgxc_scan_residualfiles(1); node_name | instance_id | pgscrf -----------+-------------+-------------------------------------------------------------- cn_5001 | cn_5001 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144421861628 (1 row) SELECT * FROM pgxc_scan_residualfiles(2); node_name | instance_id | pgscrf --------------+-------------+-------------------------------------------------------------------- dn_6001_6002 | dn_6001 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144424210395 dn_6001_6002 | dn_6001 | pg_residualfiles/pgscrf_meta_2147484281_16323_20231027144424210855 (2 rows) SELECT * FROM pgxc_scan_residualfiles(4); node_name | instance_id | pgscrf --------------+-------------+-------------------------------------------------------------- dn_6007_6008 | dn_6008 | pg_residualfiles/pgscrf_meta_1663_16323_20231027144427492060 (1 row)
  • pg_get_scan_residualfiles() 描述:用于获取当前节点所有扫描到的残留文件记录。该函数为实例级函数,与当前所在的数据库无关,可以在任意实例上运行。 返回类型:record 返回信息如下: 表3 返回字段 名称 类型 描述 handled bool 残留文件是否已经被处理,被移动或者被更改。 dbname text 数据库名称。 residualfile text 残留文件路径。 size bigint 文件大小,单位为byte。OBS路径的残留文件该项为0。 inode bigint 残留文件stat信息中的Inode。OBS路径的残留文件该项为0。 atime timestamptz 残留文件stat信息中的Access time。OBS路径的残留文件该项为空。 mtime timestamptz 残留文件stat信息中的Modifie time。OBS路径的残留文件该项为空。 ctime timestamptz 残留文件stat信息中的Chang time。OBS路径的残留文件该项为空。 filepath text 记录残留文件信息的元文件本地路径,对应pgscrf_meta文件。 notes text 注释。
  • 示例 创建表funnel_test: CREATE TABLE IF NOT EXISTS funnel_test ( user_id INT , event_type TEXT, event_time TIMESTAMP, event_timez TIMESTAMP WITH TIME ZONE, event_time_int BIGINT ); 插入数据: INSERT INTO funnel_test VALUES (1,'浏览页面','2021-01-31 11:00:00', '2021-01-31 11:00:00+08', 10), (1,'点击商品','2021-01-31 11:10:00', '2021-01-31 11:10:00+07', 20), (1,'加入购物车','2021-01-31 11:20:00', '2021-01-31 11:20:00+06', 30), (1,'支付货款','2021-01-31 11:30:00', '2021-01-31 11:30:00+05', 40), (2,'加入购物车','2021-01-31 11:00:00', '2021-01-31 11:00:00+08', 11), (2,'支付货款','2021-01-31 11:10:00', '2021-01-31 11:10:00+08', 12), (1,'浏览页面','2021-01-31 11:00:00', '2021-01-31 11:00:00+01', 50), (3,'浏览页面','2021-01-31 11:20:00', '2021-01-31 11:20:00-04', 30), (3,'点击商品','2021-01-31 12:00:00', '2021-01-31 12:00:00-04', 80), (4,'浏览页面','2021-01-31 11:50:00', '2021-01-31 11:50:00-01', 1000), (4,'支付货款','2021-01-31 12:00:00', '2021-01-31 12:00:00-02', 900), (4,'加入购物车','2021-01-31 12:00:00', '2021-01-31 12:00:00-03', 1001), (4,'点击商品','2021-01-31 12:00:00', '2021-01-31 12:00:00-04', 1001), (5,'浏览页面','2021-01-31 11:50:00', '2021-01-31 11:50:00+08', NULL), (5,'点击商品','2021-01-31 12:00:00', '2021-01-31 12:00:00+08', 776), (5,'加入购物车','2021-01-31 11:10:00', '2021-01-31 11:10:00+08', 999), (6,'浏览页面','2021-01-31 11:50:00', '2021-01-31 11:50:00+01', -1), (6,'点击商品','2021-01-31 12:00:00', '2021-01-31 12:00:00+02', -2), (6,'加入购物车','2021-01-31 12:10:00', '2021-01-31 12:00:00+03', -3); 计算每个用户的漏斗情况。返回结果如下,其中level=0表示用户在窗口期内匹配最大事件深度为0,level=1表示用户在窗口期内匹配最大事件深度为1: SELECT user_id, windowFunnel( 0, 'default', event_timez, event_type = '浏览页面', event_type = '点击商品', event_type = '加入购物车', event_type = '支付货款' ) AS level FROM funnel_test GROUP BY user_id ORDER by user_id; user_id | level ---------+------- 1 | 1 2 | 0 3 | 1 4 | 1 5 | 1 6 | 1 (6 rows) 计算每个用户的漏斗情况,指定滑动的时间窗口的大小为NULL,返回报错: SELECT user_id, windowFunnel( NULL, 'default', event_time, event_type = '浏览页面', event_type = '点击商品', event_type = '加入购物车', event_type = '支付货款' ) AS level FROM funnel_test GROUP BY user_id ORDER by user_id; ERROR: Invalid parameter : window length or mode is null. 计算每个用户的漏斗情况,指定多个条件: SELECT user_id, windowFunnel( 40, 'default', date(event_time), true, true, false, true ) AS level FROM funnel_test GROUP BY user_id ORDER by user_id; user_id | level ---------+------- 1 | 2 2 | 2 3 | 2 4 | 2 5 | 2 6 | 2 (6 rows) 分析用户的留存情况: SELECT user_id, retention( event_type = '浏览页面', event_type = '点击商品', event_type = '加入购物车', event_type = '支付货款' ) AS r FROM funnel_test GROUP BY user_id ORDER BY user_id ASC; user_id | r ---------+----------- 1 | {1,1,1,1} 2 | {0,0,0,0} 3 | {1,1,0,0} 4 | {1,1,1,1} 5 | {1,1,1,0} 6 | {1,1,1,0} (6 rows) 分析用户的留存情况,指定第一个时间为false: SELECT user_id, retention( false, event_type = '浏览页面', event_type = '点击商品', event_type = '加入购物车', event_type = '支付货款' ) AS r FROM funnel_test GROUP BY user_id ORDER BY user_id ASC; user_id | r ---------+------------- 1 | {0,0,0,0,0} 2 | {0,0,0,0,0} 3 | {0,0,0,0,0} 4 | {0,0,0,0,0} 5 | {0,0,0,0,0} 6 | {0,0,0,0,0} (6 rows) 分析用户的留存情况总和: SELECT sum(r[1]), sum(r[2]), sum(r[3]), sum(r[4]) FROM ( SELECT retention(event_type = '浏览页面', event_type = '点击商品', event_type = '加入购物车', event_type = '支付货款') AS r FROM funnel_test GROUP BY user_id ); sum | sum | sum | sum -----+-----+-----+----- 5 | 5 | 4 | 2 (1 row) 统计每个用户在1,3,7天后的付费留存率: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT user_id, range_retention_count(event_type = '浏览页面', event_type = '支付货款', DATE(event_time), ARRAY[1, 3, 7], 'day') as r FROM funnel_test GROUP BY user_id ORDER BY user_id; user_id | r ---------+------------------ 1 | {80135499808768} 2 | {} 3 | {80135499808768} 4 | {80135499808768} 5 | {80135499808768} 6 | {80135499808768} (6 rows)
  • retention retention函数可以将一组条件作为参数,分析事件是否满足该条件。 语法 1 retention(cond1, cond2, ..., cond32); 入参说明 cond:变长boolean数组,最大长度32,用来表示事件是否满足特定条件。GaussDB(DWS)只支持1~32个condition,不在此范围报错处理。 返回值 retention condition:tinyint数组类型。返回结果的表达式,与入参cond长度一致,若第cond1和condi条件满足,则返回值第i个值为1,否则为0。
  • windowfunnel windowfunnel函数用于在滑动的时间窗口中搜索事件列表并计算条件匹配的事件列表的最大长度。GaussDB(DWS)根据用户定义的事件列表,从第一个事件开始匹配,依次做有序最长的匹配,返回匹配的最大长度。一旦匹配失败,结束整个匹配。具体介绍如下: 假设在窗口足够大的条件下: 条件事件为c1,c2,c3,而用户数据为c1,c2,c3,c4,最终匹配到c1,c2,c3,函数返回值为3。 条件事件为c1,c2,c3,而用户数据为c4,c3,c2,c1,最终匹配到c1,函数返回值为1。 条件事件为c1,c2,c3,而用户数据为c4,c3,最终没有匹配到事件,函数返回值为0。 语法 1 windowFunnel(window, mode, timestamp, cond1, cond2, ..., condN) 入参说明 window:bigint类型。滑动的时间窗口的大小,指从第一个事件开始,往后推移的时间窗口大小,单位为秒。 mode:text类型。目前仅支持default模式,其他模式报错处理。Default模式是指在同一个窗口期内,从第一个事件开始匹配,尽量匹配多的事件。 timestamp:事件发生的时间范围,支持timestamp without time zone、timestamp with time zone、date、int、bigint类型。 cond:变长boolean数组。指当前Tuple的数据满足事件的哪个步骤。GaussDB(DWS)只支持1~32个condition,不在此范围报错处理。 返回值 level:int类型。条件匹配的事件列表的最大长度。
  • range_retention_count 描述:记录每个用户的留存情况,该函数返回数组,可以作为range_retention_sum函数的入参。 语法 1 range_retention_count(is_first, is_active, dt, retention_interval, retention_granularity, output_format) 入参说明 is_first:bool类型,是否符合初始行为,true表示符合, false表示不符合 。 is_active:bool类型,是否符合留存行为,true表示符合, false表示不符合 。 dt:date类型,发生行为的日期。 retention_interval:数组类型,表示留存间隔,最多支持15个留存间隔。例如ARRAY[1,3,5,7,15,30]。 retention_granularity:text类型,表示留存分析粒度,执行日(day)、周(week)、月(month)三种。 output_format:text类型,表示输出格式,支持normal(默认)和expand(可取得每日留存明细)两种。 返回值:用户留存情况BIGINT数组。
  • 构造复合值 要把复合值写作文字常量,可以将字段值括在圆括号中,并用逗号分隔。可以在任何字段值加上双引号,如果字段值包含逗号或括号则必须这样做。复合常量的一般格式如下: 1 '( val1 , val2 , ... )' 上文中的'("fuzzy dice",42,1.99)'便属于inventory_item类型的一个合法值。 要让一个字段为NULL,在列表中对应位置上空出即可。如果需要一个字段为空字符串,使用引号即可。例如下列示例,第一个字段是非NULL空字符串,第三个是NULL: 1 '("",42,)' ROW表达式也能被用来构建组合值。例如: 1 2 ROW('fuzzy dice', 42, 1.99) ROW('', 42, NULL)
共100000条