排序计算函数
排序计算函数提供基本的排序场景计算能力。
| 功能 | 函数 |
|---|---|
| 对给定的列按照时间序列排序并返回第一个值。 | |
| 对给定的列按照时间序列排序并返回最后一个值。 | |
| 对给定的列按照序列排序并返回百分位值。 | |
| 对给定的列按照从小到大的顺序排序并返回百分位值。 | value_of_percentile(column float,percentile float, compression float) |
| 对给定的列按照从小到大的顺序排序,根据百分位值计算百分位。 | percentile_of_value(column float,percentilevalue float, compression float) |
| 对给定列排序后最小的K个元组。 | |
| 对给定列排序后最大的K个元组。 |
first(value_array anyarray, time_array timearray)
描述:对给定的列按照时间序列排序并返回第一个值。
参数:参数说明如表2所示。
返回值类型:anyelement
- 函数内部使用INTEGER类型作数组索引,不支持数据量超过INTEGER类型所支持的数值范围。
示例:
gaussdb=# SELECT
gaussdb-# first(array_agg(value), array_agg(time))
gaussdb-# FROM
gaussdb-# (VALUES ('2019-07-12 00:00:00'::timestamptz,'c','a'),
gaussdb(# ('2019-07-12 00:01:00'::timestamptz,'b','a'),
gaussdb(# ('2019-07-12 00:02:01'::timestamptz,'a','b')) v(time, value, tag)
gaussdb-# GROUP BY tag;
first
-------
c
a
(2 rows) last(value_array anyarray, time_array timearray)
描述:对给定的列按照时间序列排序并返回最后一个值。
参数:参数说明如表3所示。
返回值类型:anyelement
- 函数内部使用INTEGER类型作数组索引,不支持数据量超过INTEGER类型所支持的数值范围。
示例:
gaussdb=# SELECT
gaussdb-# last(array_agg(value), array_agg(time))
gaussdb-# FROM
gaussdb-# (VALUES ('2019-07-12 00:00:00'::timestamptz,'c','a'),
gaussdb(# ('2019-07-12 00:01:00'::timestamptz,'b','a'),
gaussdb(# ('2019-07-12 00:02:01'::timestamptz,'a','b')) v(time, value, tag)
gaussdb-# GROUP BY tag;
last
------
b
a
(2 rows) percentile_cont(percentile float)
描述:对给定的列按照序列排序并返回百分位值。需要与within group (order by) 结合使用,指定分位值的列,且该列类型需要为数值型或interval。
参数:参数说明如表4所示。
返回值类型:float或interval,取决于within group (order by)指定列的值为数值型或interval。
- percentile为[0,1]之间的小数,精度为浮点值类型,不支持95%写法。
示例:
gaussdb=# SELECT
gaussdb-# percentile_cont(0.5) WITHIN GROUP (ORDER BY value)
gaussdb-# FROM
gaussdb-# (VALUES ('2019-07-12 00:00:01'::timestamptz,'red',1),
gaussdb(# ('2019-07-12 00:00:01'::timestamptz,'blue',2)) v(time,color,value);
percentile_cont
-----------------
1.5
(1 row) value_of_percentile(column float,percentile float, compression float)
描述:对给定的列按照从小到大的顺序排序并返回百分位值。
参数:参数说明如表5所示。
返回值类型:float
| 参数名 | 类型 | 描述 |
|---|---|---|
| column | float | 指定列名。 |
| percentile | float | 指定百分位,取值范围[0,1],例如0.95为95分位值。 |
| compression | float | 指定压缩系数,取值范围[0,500],系统默认为300,若用默认值,这个参数位置写0,否则按照取值范围自行填写,例如300则按照300对总体数据的数量进行压缩,数据越大,占用内存越大。 |
示例:
gaussdb=#DROP TABLE IF EXISTS partition_scan2;
gaussdb=#CREATE TABLE partition_scan2(a int);
gaussdb=#insert into partition_scan2 values(generate_series(1,100,1));
gaussdb=# SELECT value_of_percentile(a,0.8,0) from partition_scan2;
value_of_percentile
---------------------
80.5
(1 row) percentile_of_value(column float,percentilevalue float, compression float)
描述:对给定的列按照从小到大的顺序排序并返回百分位。
参数:参数说明如表6所示。
返回值类型:float
| 参数名 | 类型 | 描述 |
|---|---|---|
| column | float | 指定列名。 |
| percentilevalue | float | 指定百分位值,根据百分位值计算百分位,精度为浮点值。 |
| compression | float | 指定压缩系数,取值范围[0,500],精度为浮点值,系统默认为300,若用默认值,这个参数位置写0,否则按照取值范围自行填写,例如300则按照300对总体数据的数量进行压缩,数据越大,占用内存越大。 |
gaussdb=#DROP TABLE IF EXISTS partition_scan2;
gaussdb=#CREATE TABLE partition_scan2(a int);
gaussdb=#insert into partition_scan2 values(generate_series(1,100,1));
gaussdb=# SELECT percentile_of_value(a,80,0) from partition_scan2;
percentile_of_value
---------------------
.795
(1 row) top_k(array real[],k int)
描述:对给定的列按照从小到大排序返回最小的K个元组。
参数:参数说明如表7所示。
返回值类型:real[]
- k应为非负数,若为负数,会返回空值。
- k应小于array大小,若大于当前数组长度,报错。
- 内部使用array_sort排序,仅支持一维数组。请参见数组函数和操作符章节中介绍。
- array不能为空,若为空函数直接返回空。
- 不支持对数据量超过int类型取值范围的数组使用。
示例:
gaussdb=# SELECT
gaussdb-# top_k(array_agg(v), 0.5),v2
gaussdb-# FROM
gaussdb-# (VALUES (1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'a'),(6,'a')) v(v,v2)
gaussdb-# GROUP BY v2;
top_k | v2
-------+----
{1} | a
(1 row) bottom_k(array real[],k int)
描述:对给定的列按照从小到大排序并返回最大的K个元组。
参数:参数说明如表8所示。
返回值类型:real[]
- k应为非负数,若为负数,会返回空值。
- k应小于array大小,若大于当前数组长度,报错。
- 内部使用array_sort排序,仅支持一维数组。请参见数组函数和操作符章节中介绍。
- array不能为空,若为空函数直接返回空。
- 不支持对数据量超过int类型取值范围的数组使用。
示例:
gaussdb=# SELECT
gaussdb-# bottom_k(array_agg(v), 0.5),v2
gaussdb-# FROM
gaussdb-# (VALUES (1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'a'),(6,'a')) v(v,v2)
gaussdb-# GROUP BY v2;
bottom_k | v2
----------+----
{6} | a
(1 row)