华为云用户手册

  • hll_union(hll, hll) 描述:把两个hll数据结构union成一个。 返回值类型:hll 示例: 1 2 3 4 5 SELECT hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_union ------------------------------------------ \x128b7f8895a3f5af28cafeda0ce907e4355b60 (1 row)
  • hll_print(hll) 描述:打印hll的一些debug参数信息。 返回值类型:cstring 示例: 1 2 3 4 5 SELECT hll_print(hll_empty()); hll_print ----------------------------------------------------------- EMPTY, nregs=2048, nbits=5, expthresh=-1(160), sparseon=1gongne (1 row)
  • hll_add_rev(hll_hashval, hll) 描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。 返回值类型:hll 示例: 1 2 3 4 5 SELECT hll_add_rev(hll_hash_integer(1), hll_empty()); hll_add_rev -------------------------- \x128b7f8895a3f5af28cafe (1 row)
  • hll_empty(int32 log2m, int32 regwidth, int64 expthresh) 描述:创建空的hll并依次指定参数log2m、regwidth、expthresh。expthresh取值范围是-1到7之间的整数。该参数可以用来设置从Explicit模式到Sparse模式的阈值大小。-1表示自动模式,0表示跳过Explicit模式,取1-7表示在基数到达2expthresh时切换模式。 返回值类型:hll 示例: 1 2 3 4 5 SELECT hll_empty(10, 4, 7); hll_empty ----------- \x116a48 (1 row)
  • hll_empty(int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon) 描述:创建空的hll并依次指定参数log2m、regwidth、expthresh、sparseon。sparseon取0或者1。 返回值类型:hll 示例: 1 2 3 4 5 SELECT hll_empty(10,4,7,0); hll_empty ----------- \x116a08 (1 row)
  • hll_add(hll, hll_hashval) 描述:把hll_hashval加入到hll中。 返回值类型:hll 示例: 1 2 3 4 5 SELECT hll_add(hll_empty(), hll_hash_integer(1)); hll_add -------------------------- \x128b7f8895a3f5af28cafe (1 row)
  • 功能描述 根据一个索引对表进行聚簇排序。 CLUSTER指示 GaussDB (DWS)基于索引名指定的索引来聚簇由表名指定的表。索引名指定的索引索引必须已经定义在指定表上。 当对一个表聚簇后,该表将基于索引信息进行物理排序。聚簇是一次性操作:当表被更新之后, 更改的内容不会被聚簇。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚簇。 在对一个表聚簇之后,GaussDB(DWS)会记录在哪个索引上建立了聚簇。 形式CLUSTER table_name会使用前面所用的同一个索引对表重新聚簇。用户也可以用CLUSTER或ALTER TABLE的SET WITHOUT CLUSTER形式把索引设置为可用于后续的聚簇操作或清除任何之前的设置。 不含参数的CLUSTER会将当前用户所拥有的数据库中的先前做过聚簇的所有表重新聚簇,如果是系统管理员调用,则是所有已被聚簇过的表。 在对一个表进行聚簇的时候,会在其上请求一个AC CES S EXCLUSIVE锁。这样就避免了在CLUSTER完成之前对此表执行其它的操作(包括读写)。
  • 示例 创建一个分区表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE tpcds.inventory_p1 ( INV_DATE_SK INTEGER NOT NULL, INV_ITEM_SK INTEGER NOT NULL, INV_WAREHOUSE_SK INTEGER NOT NULL, INV_QUANTITY_ON_HAND INTEGER ) DISTRIBUTE BY HASH(INV_ITEM_SK) PARTITION BY RANGE(INV_DATE_SK) ( PARTITION P1 VALUES LESS THAN(2451179), PARTITION P2 VALUES LESS THAN(2451544), PARTITION P3 VALUES LESS THAN(2451910), PARTITION P4 VALUES LESS THAN(2452275), PARTITION P5 VALUES LESS THAN(2452640), PARTITION P6 VALUES LESS THAN(2453005), PARTITION P7 VALUES LESS THAN(MAXVALUE) ); 创建索引ds_inventory_p1_index1。 1 CREATE INDEX ds_inventory_p1_index1 ON tpcds.inventory_p1 (INV_ITEM_SK) LOCAL; 对表tpcds.inventory_p1进行聚集: 1 CLUSTER tpcds.inventory_p1 USING ds_inventory_p1_index1; 对分区p3进行聚集: 1 CLUSTER tpcds.inventory_p1 PARTITION (p3) USING ds_inventory_p1_index1; 对数据库中可以进行聚集的表进聚集: 1 CLUSTER;
  • 注意事项 只有行存B-tree索引支持CLUSTER操作。 如果用户只是随机访问表中的行,那么表中数据的实际存储顺序是无关紧要的。但是, 如果对某些数据的访问多于其它数据,而且有一个索引将这些数据分组, 那么使用CLUSTER会有所帮助。如果从一个表中请求一定索引范围的值, 或者是一个索引值对应多行,CLUSTER也会有助于应用,因为如果索引标识出第一匹配行所在的存储页,所有其它行也可能已经在同一个存储页里了,这样便节省了磁盘访问的时间,加速了查询。 在聚簇过程中,系统先创建一个按照索引顺序建立的表的临时拷贝,同时也建立表上的每个索引的临时拷贝。因此,需要磁盘上有足够的剩余空间, 至少是表大小和索引大小的和。 由于CLUSTER会记忆聚集信息,可以在第一次的时候手工对表进行聚簇,然后设置一个类似VACUUM的时间,这样就可以周期地自动对表进行聚簇操作。 因为优化器记录着有关表的排序的统计,所以建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。 CLUSTER不允许在事务中执行。 对表执行CLUSTER操作时会触发表重建(表重建过程中会先把数据转储到一个新的数据文件中,重建完成之后会删除原始文件),当表比较大时,重建会消耗较多的磁盘空间。当磁盘空间不足时,要谨慎对待大表CLUSTER操作,防止触发集群只读。
  • 语法格式 对一个表进行聚簇排序。 1 CLUSTER [ VERBOSE ] table_name [ USING index_name ]; 对一个分区进行聚簇排序。 1 CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ]; 对已做过聚簇的表重新进行聚簇。 1 CLUSTER [ VERBOSE ];
  • tsvector tsvector类型表示一个检索单元,通常是一个数据库表中的一行文本字段或者这些字段的组合。 tsvector类型的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会按照一定的顺序录入,并自动去掉分词中重复的词条。 to_tsvector函数通常用于解析和标准化文档字符串。 通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照字母和长短排序的,请看以下例子: 1 2 3 4 5 SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat' (1 row) 如果词条中包含空格或标点符号,可以用引号包围: 1 2 3 4 5 SELECT $$the lexeme ' ' contains spaces$$::tsvector; tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the' (1 row) 使用常规的单引号引起来的字符串,字符串中嵌入的单引号(')和反斜杠(\)必须双写进行转义: 1 2 3 4 5 SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the' (1 row) 词条位置常量也可以放到词汇中: 1 2 3 4 5 SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; tsvector ------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4 (1 row) 位置常量通常表示文档中源字的位置。位置信息可以用于进行排名。位置常量的范围是1到16383,最大值默认是16383。相同词的重复位会被忽略掉。 拥有位置的词汇可以进一步地被标注一个权重,它可以是A,B,C或D。 D是默认权重,因此输出中不会显示: 1 2 3 4 5 SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C (1 row) 权重通常被用来反映文档结构,如:将标题标记成与正文词不同。文本检索排序函数可以为不同的权重标记分配不同的优先级。 tsvector类型标准用法示例如下: 1 2 3 4 5 SELECT 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The' (1 row) 但是对于英文全文检索应用来说,上面的单词会被认为非规范化的,所以需要通过to_tsvector函数对这些单词进行规范化处理: 1 2 3 4 5 SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3 (1 row)
  • tsquery tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)将这些词汇进行组合,圆括号用来强调操作符的分组。如果没有圆括号,(NOT)的优先级最高,其次是&(AND),最后是|(OR)。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat' (1 row) SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' ) (1 row) SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat' (1 row) tsquery中的词汇可以用一个或多个权重字母来标记,这些权重字母限制词汇只能与匹配权重的tsvector词汇进行匹配。 1 2 3 4 5 SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat' (1 row) 同样,tsquery中的词汇可以用*标记来指定前缀匹配。例如:这个查询可以匹配tsvector中以“super”开始的任意单词。 1 2 3 4 5 SELECT 'super:*'::tsquery; tsquery ----------- 'super':* (1 row) 需注意,前缀匹配会首先被文本搜索分词器处理。例如:postgres中提取的词干是postgr,匹配到了postgraduate,也就意味着下面的结果为真: 1 2 3 4 5 SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ) AS RESULT; result ---------- t (1 row) 1 2 3 4 5 SELECT to_tsquery('postgres:*'); to_tsquery ------------ 'postgr':* (1 row) to_tsquery函数会将单词转换为tsquery类型前进行规范化处理。'Fat:ab & Cats'规范化转为tsquery类型结果如下: 1 2 3 4 5 SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat' (1 row)
  • 参数说明 IF EXISTS 如果指定的模式不存在,发出一个notice而不是抛出一个错误。 schema_name 模式的名字。 取值范围:已存在模式名。 CASCADE | RESTRICT CASCADE:自动删除包含在模式中的对象。 RESTRICT:如果模式包含任何对象,则删除失败(缺省行为)。 不要随意删除pg_temp或pg_toast_temp开头的模式,这些模式是系统内部使用的,如果删除,可能导致无法预知的结果。 无法删除当前模式。如果要删除当前模式,须切换到其他模式下。
  • 语法格式 开启匿名块 1 2 3 4 5 [DECLARE [declare_statements]] BEGIN execution_statements END; / 开启事务 1 2 3 4 5 6 7 BEGIN [ WORK | TRANSACTION ] [ { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ];
  • 解析查询 GaussDB(DWS)提供了函数to_tsquery和plainto_tsquery将查询转换为tsquery数据类型,to_tsquery提供比plainto_tsquery更多的功能,但对其输入要求更严格。 to_tsquery([ config regconfig, ] querytext text) returns tsquery to_tsquery从querytext中创建一个tsquery,querytext必须由布尔运算符& (AND),| (OR)和! (NOT)分割的单个token组成。这些运算符可以用圆括弧分组。换句话说,to_tsquery输入必须遵循tsquery输入的通用规则,具体请参见文本搜索类型。不同的是基本tsquery以token表面值作为输入,而to_tsquery使用指定或默认分词器将每个token标准化成词素,并依据分词器丢弃属于停用词的token。例如: 1 2 3 4 5 SELECT to_tsquery('english', 'The & Fat & Rats'); to_tsquery --------------- 'fat' & 'rat' (1 row) 像在基本tsquery中的输入一样,weight(s)可以附加到每个词素来限制它只匹配那些有相同weight(s)的tsvector词素。比如: 1 2 3 4 5 SELECT to_tsquery('english', 'Fat | Rats:AB'); to_tsquery ------------------ 'fat' | 'rat':AB (1 row) 同时,*也可以附加到词素来指定前缀匹配: 1 2 3 4 5 SELECT to_tsquery('supern:*A & star:A*B'); to_tsquery -------------------------- 'supern':*A & 'star':*AB (1 row) 这样的词素将匹配tsquery中指定字符串和权重的项。 plainto_tsquery([ config regconfig, ] querytext text) returns tsquery plainto_tsquery将未格式化的文本querytext变换为tsquery。类似于to_tsvector,文本被解析并且标准化,然后在存在的词之间插入&(AND)布尔算子。 比如: 1 2 3 4 5 SELECT plainto_tsquery('english', 'The Fat Rats'); plainto_tsquery ----------------- 'fat' & 'rat' (1 row) 请注意,plainto_tsquery无法识别布尔运算符、权重标签,或在其输入中的前缀匹配标签: 1 2 3 4 5 SELECT plainto_tsquery('english', 'The Fat & Rats:C'); plainto_tsquery --------------------- 'fat' & 'rat' & 'c' (1 row) 在这里,所有输入的标点符号作为空格符号丢弃。 父主题: 控制文本搜索
  • get_db_source_datasize() 描述:估算当前数据库非压缩态的数据总容量。 返回值类型:bigint 备注:(1)调用该函数前需要做analyze;(2)通过估算列存的压缩率计算非压缩态的数据总容量。 示例: 1 2 3 4 5 6 7 analyze; ANALYZE SELECT get_db_source_datasize(); get_db_source_datasize ------------------------ 35384925667 (1 row)
  • pg_database_size(name) 描述:指定名称的数据库使用的磁盘空间。 返回值类型:bigint 备注:pg_database_size接收一个数据库的OID或者名字,然后返回该对象使用的全部磁盘空间。 示例: 1 2 3 4 5 SELECT pg_database_size('gaussdb'); pg_database_size ------------------ 51590112 (1 row)
  • 示例 创建名称为server_remote的外部服务器,对应的foreign data wrapper为GC_FDW。 1 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',dbname 'test', username 'test', password '{password}'); 在可选项options里面写入了关联集群CN对应的IP地址及端口号。这里推荐使用填写一个LVS的地址或者多个CN的地址。 创建名称为region的外表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE FOREIGN TABLE region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ) SERVER server_remote OPTIONS ( schema_name 'test', table_name 'region', encoding 'gbk' ); 查看创建的外表region: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \d+ region Foreign table "public.region" Column | Type | Modifiers | FDW Options | Storage | Stats target | Description -------------+---------+-----------+-------------+----------+--------------+------------- r_regionkey | integer | | | plain | | r_name | text | | | extended | | r_comment | text | | | extended | | Server: server_remote FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk') FDW permission: read only Has OIDs: no Distribute By: ROUND ROBIN Location Nodes: ALL DATANODES
  • 参数说明 IF NOT EXISTS 如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。 table_name 外表的表名。 取值范围:字符串,要符合标识符的命名规范。 column_name 外表中的字段名。可以选择多个字段名,中间用“,”隔开。 取值范围:字符串,要符合标识符的命名规范。 不允许在列上创建约束,也不允许创建索引。 type_name 字段的数据类型。 不允许使用序列当作类型和使用自定义类型。 SERVER server_name server名称。允许用户自定义名称。 取值范围:字符串,要符合标识符的命名规范,并且该server必须存在。 OPTIONS ( { option_name ' value ' } [, ...] ) 用于指定外表数据的各类参数,参数类型如下所示。 table_name:对应关联集群的表名,如果省略此option则认为该值和外表名字一样。 schema_name:对应关联集群的schema,如果省略此option则认为该值和外表所在的schema一样。 encoding:对应关联集群的编码,如果省略此option则使用关联集群的数据库编码。 dataencoding:用于实现GDS互联互通时两个latin1库中GBK数据和UTF8数据的同步。该参数仅8.2.0及以上集群版本支持。 当设置该参数时,encoding表示远端集群数据的真实编码,dataencoding表示为本地执行端的集群数据的真实编码。 假如本地执行端和远端两个数据库分别为latin1_local_db和latin1_remote_db,latin1_remote_db中存储着GBK的数据,当把latin1_remote_db中GBK的数据以UTF8的编码迁移到latin1_local_db时,需要在本地端的集群设置外表的dataencoding为UTF8,encoding为GBK。 gds_compress GDS互联互通为了降低网络传输带宽,提供了压缩参数,默认不压缩,当前仅支持设置值为snappy。该参数仅8.2.0及以上集群版本支持。 使用该功能时需要保证本地集群,远端集群,GDS的版本至少在同一版本。 gds_compress与file_type配合使用,当file_type的参数为interconn时,gds需要升级到8.2.0及以上版本,否则会出现ERROR: un-support format报错。 READ ONLY 显示表是外表为只读。 DISTRIBUTE BY ROUNDROBIN 显示指定外表为ROUNDROBIN分布方式。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP目前不支持使用。TO NODE主要供内部扩容工具使用,一般用户不应使用。
  • 语法格式 1 2 3 4 5 6 7 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name | LIKE source_table } [, ...] ] ) SERVER server_name OPTIONS ( { option_name ' value ' } [, ...] ) [ READ ONLY ] [ DISTRIBUTE BY {ROUNDROBIN} ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];
  • NTH_VALUE(value any, nth integer) 描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,NTH_VALUE(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | nth_value ----+---------+-------+----------- 1 | 1 | 95 | 2 | 2 | 95 | 5 | 2 | 88 | 5 3 | 2 | 85 | 5 4 | 1 | 70 | 5 6 | 1 | 70 | 5 (6 rows)
  • FIRST_VALUE(value any) 描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,FIRST_VALUE(id) OVER(ORDER BY score DESC) FROM score; id | classid | score | first_value ----+---------+-------+------------- 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 1 3 | 2 | 85 | 1 4 | 1 | 70 | 1 6 | 1 | 70 | 1 (6 rows)
  • LEAD(value any [, offset integer [, default any ]]) 描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LEAD(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | lead ----+---------+-------+------ 1 | 1 | 95 | 3 2 | 2 | 95 | 4 5 | 2 | 88 | 6 3 | 2 | 85 | 4 | 1 | 70 | 6 | 1 | 70 | (6 rows)
  • LAST_VALUE(value any) 描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LAST_VALUE(id) OVER(ORDER BY score DESC) FROM score; id | classid | score | last_value ----+---------+-------+------------ 1 | 1 | 95 | 2 2 | 2 | 95 | 2 5 | 2 | 88 | 5 3 | 2 | 85 | 3 4 | 1 | 70 | 6 6 | 1 | 70 | 6 (6 rows)
  • PERCENT_RANK() 描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 返回值类型:DOUBLE PRECISION 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,PERCENT_RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | percent_rank ----+---------+-------+-------------- 1 | 1 | 95 | 0 2 | 2 | 95 | 0 3 | 2 | 85 | .6 4 | 1 | 70 | .8 5 | 2 | 88 | .4 6 | 1 | 70 | .8 (6 rows)
  • CUME_DIST() 描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。 返回值类型:DOUBLE PRECISION 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,CUME_DIST() OVER(ORDER BY score DESC) FROM score; id | classid | score | cume_dist ----+---------+-------+------------------ 1 | 1 | 95 | .333333333333333 2 | 2 | 95 | .333333333333333 5 | 2 | 88 | .5 3 | 2 | 85 | .666666666666667 4 | 1 | 70 | 1 6 | 1 | 70 | 1 (6 rows)
  • NTILE(num_buckets integer) 描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。 返回值类型:INTEGER 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,NTILE(3) OVER(ORDER BY score DESC) FROM score; id | classid | score | ntile ----+---------+-------+------- 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 2 3 | 2 | 85 | 2 4 | 1 | 70 | 3 6 | 1 | 70 | 3 (6 rows)
  • LAG(value any [, offset integer [, default any ]]) 描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LAG(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | lag ----+---------+-------+----- 1 | 1 | 95 | 2 | 2 | 95 | 5 | 2 | 88 | 3 | 2 | 85 | 1 4 | 1 | 70 | 2 6 | 1 | 70 | 5 (6 rows)
  • DENSE_RANK() 描述:DENSE_RANK函数为各组内值生成连续排序序号,其中相同的值具有相同序号,相同值只占用一个编号。 返回值类型:BIGINT 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,DENSE_RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | dense_rank ----+---------+-------+------------ 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 2 3 | 2 | 85 | 3 6 | 1 | 70 | 4 4 | 1 | 70 | 4 (6 rows)
  • 语法格式 窗口函数需要特殊的关键字OVER语句来指定窗口触发窗口函数。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号: 1 2 3 4 function_name ([expression [, expression ... ]]) OVER ( window_definition ) function_name ([expression [, expression ... ]]) OVER window_name function_name ( * ) OVER ( window_definition ) function_name ( * ) OVER window_name 其中window_definition子句option为: 1 2 3 4 [ existing_window_name ] [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ] PARTITION BY选项指定了将具有相同PARTITION BY表达式值的行分为一组。 ORDER BY选项用于控制窗口函数处理行的顺序。ORDER BY后面必须跟字段名,若ORDER BY后面跟数字,该数字会被按照常量处理,对目标列没有起到排序的作用。 frame_clause子句option为: 1 2 [ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end 当需要指定一个窗口对分组内所有行结果进行计算时,我们需要指定窗口区间开始的行和结束的行。窗口区间支持RANGE、ROWS两种模式,ROWS以物理单位(行)指定窗口,RANGE将窗口指定为逻辑偏移量。 RANGE、ROWS中可以使用BETWEEN frame_start AND frame_end指定边界可取值。如果仅指定frame_start,则frame_end默认为CURRENT ROW。 frame_start和frame_end取值为: CURRENT ROW,当前行。 N PRECEDING,当前行向前第n行。 UNBOUNDED PRECEDING,当前PARTITION的第1行。 N FOLLOWING,当前行向后第n行。 UNBOUNDED FOLLOWING,当前PARTITION的最后1行。 需要注意,frame_start不能为UNBOUNDED FOLLOWING,frame_end不能为UNBOUNDED PRECEDING,并且frame_end选项不能比上面取值中出现的frame_start选项早。例如RANGE BETWEEN CURRENT ROW AND N PRECEDING是不被允许的。 8.3.0.100及以上版本集群,LAST_VALUE函数支持IGNORE NULLS语法,该语法返回非NULL窗口中的最后一个值,如果所有值都为NULL,则返回NULL,具体格式为: 1 LAST_VALUE (expression [IGNORE NULLS]) OVER (window_definition)
共100000条