更新时间:2026-10-21 GMT+08:00
分享

排序计算函数

排序计算函数提供基本的排序场景计算能力。

表1 排序计算支持的函数一览

功能

函数

对给定的列按照时间序列排序并返回第一个值。

first(value_array anyarray, time_array timearray)

对给定的列按照时间序列排序并返回最后一个值。

last(value_array anyarray, time_array timearray)

对给定的列按照序列排序并返回百分位值。

percentile_cont(percentile float)

对给定的列按照从小到大的顺序排序并返回百分位值。

value_of_percentile(column float,percentile float, compression float)

对给定的列按照从小到大的顺序排序,根据百分位值计算百分位。

percentile_of_value(column float,percentilevalue float, compression float)

对给定列排序后最小的K个元组。

top_k(array real[],k int)

对给定列排序后最大的K个元组。

bottom_k(array real[],k int)

first(value_array anyarray, time_array timearray)

描述:对给定的列按照时间序列排序并返回第一个值。

参数:参数说明如表2所示。

返回值类型:anyelement

表2 first函数参数说明

参数名

类型

描述

value_array

anyarray

查询列的数组。

time_array

timearray

时间值的数组。

  • 函数内部使用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

表3 last函数参数说明

参数名

类型

描述

value_array

anyarray

查询列的数组。

time_array

timearray

时间值的数组。

  • 函数内部使用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。

表4 percentile_cont函数参数说明

参数名

类型

描述

percentile

float

指定百分位,取值范围[0,1],精度为浮点值,例如0.95为95分位值。

  • 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

表5 value_of_percentile函数参数说明

参数名

类型

描述

column

float

指定列名。

percentile

float

指定百分位,取值范围[0,1],例如0.95为95分位值。

compression

float

指定压缩系数,取值范围[0,500],系统默认为300,若用默认值,这个参数位置写0,否则按照取值范围自行填写,例如300则按照300对总体数据的数量进行压缩,数据越大,占用内存越大。

  • 需要指定列名。
  • percentile为[0,1]之间的小数,精度为浮点值类型,不支持95%写法。
  • compression为[0,500]之间的数,默认值为300,若输入值大于500或者小于0,则按照默认值处理。
  • 建议在满足如下约束的场景下使用,在满足约束条件的前提下,大部分场景准确度大于75%:

    (1) 整体数据符合正态分布。

    (2) 每个DN上的数据分布均匀,也符合正态分布。

    (3) 数据量需要大于一万。

    (4) 只适合两端数据,对于极端数据百分位小于1%和大于99%的数据。

示例:

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

表6 percentile_of_value函数参数说明

参数名

类型

描述

column

float

指定列名。

percentilevalue

float

指定百分位值,根据百分位值计算百分位,精度为浮点值。

compression

float

指定压缩系数,取值范围[0,500],精度为浮点值,系统默认为300,若用默认值,这个参数位置写0,否则按照取值范围自行填写,例如300则按照300对总体数据的数量进行压缩,数据越大,占用内存越大。

  • 需要指定列名。
  • percentilevalue任意值,精度为浮点值类型。
  • compression为[0,500]之间的数,默认值为300,若输入值大于500或者小于0,则按照默认值处理。
  • 建议在满足如下约束的场景下使用,在满足约束条件的前提下,大部分场景准确度大于75%:

    (1) 整体数据符合正态分布。

    (2) 每个DN上的数据分布均匀,也符合正态分布。

    (3) 数据量需要大于一万。

    (4) 只适合两端数据,对于极端数据百分位小于1%和大于99%的数据。

示例:
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[]

表7 top_k函数参数说明

参数名

类型

描述

array

real[]

输入的数组。

k

int

指定最小的K个元组。

  • 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[]

表8 bottom_k函数参数说明

参数名

类型

描述

k

int

指定最大的K个元组。

  • 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)

相关文档