# 排序计算函数
排序计算函数提供基本的排序场景计算能力。
表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
 表2first函数参数说明 
| 参数名        | 类型        | 描述      |
|:---|:---|:---|
| value_array | anyarray  | 查询列的数组。 |
| time_array    | timearray | 时间值的数组。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 函数内部使用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,
gaussdb) v(time, value, tag)
gaussdb-# GROUP BY tag;
 first
-------
 c
 a
(2 rows)
```
 #### last(value_array anyarray, time_array timearray)
描述：对给定的列按照时间序列排序并返回最后一个值。
参数：参数说明如[表3]所示。
返回值类型：anyelement
 表3last函数参数说明 
| 参数名         | 类型         | 描述       |
|:---|:---|:---|
| value_array | anyarray    | 查询列的数组。 |
| time_array  | timearray | 时间值的数组。    |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 函数内部使用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,
gaussdb) 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。
 表4percentile_cont函数参数说明 
| 参数名         | 类型  | 描述                                   |
|:---|:---|:---|
| percentile | float | 指定百分位，取值范围\[0，1\]，精度为浮点值，例如0.95为95分位值。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 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) v(time,color,value);
 percentile_cont
-----------------
             1.5
(1 row)
```
 #### value_of_percentile(column float，percentile float, compression float)
描述：对给定的列按照从小到大的顺序排序并返回百分位值。
参数：参数说明如[表5]所示。
返回值类型：float
 表5value_of_percentile函数参数说明 
| 参数名         | 类型      | 描述                                                                                             |
|:---|:---|:---|
| column     | float  | 指定列名。                                                                                            |
| percentile | float   | 指定百分位，取值范围\[0，1\]，例如0.95为95分位值。                                                                 |
| compression | float | 指定压缩系数，取值范围\[0，500\]，系统默认为300，若用默认值，这个参数位置写0，否则按照取值范围自行填写，例如300则按照300对总体数据的数量进行压缩，数据越大，占用内存越大。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 需要指定列名。
- 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
 表6percentile_of_value函数参数说明 
| 参数名             | 类型       | 描述                                                                                                     |
|:---|:---|:---|
| column         | float  | 指定列名。                                                                                                 |
| percentilevalue | float | 指定百分位值，根据百分位值计算百分位，精度为浮点值。                                                                             |
| compression   | float   | 指定压缩系数，取值范围\[0，500\]，精度为浮点值，系统默认为300，若用默认值，这个参数位置写0，否则按照取值范围自行填写，例如300则按照300对总体数据的数量进行压缩，数据越大，占用内存越大。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 需要指定列名。
- 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\[\]
 表7top_k函数参数说明 
| 参数名 | 类型      | 描述        |
|:---|:---|:---|
| array | real\[\] | 输入的数组。    |
| k   | int       | 指定最小的K个元组。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- k应为非负数，若为负数，会返回空值。
- k应小于array大小，若大于当前数组长度，报错。
- 内部使用array_sort排序，仅支持一维数组。请参见[数组函数和操作符](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0054.html)章节中介绍。
- 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\[\]
 表8bottom_k函数参数说明 
| 参数名 | 类型 | 描述          |
|:---|:---|:---|
| k   | int | 指定最大的K个元组。 |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- k应为非负数，若为负数，会返回空值。
- k应小于array大小，若大于当前数组长度，报错。
- 内部使用array_sort排序，仅支持一维数组。请参见[数组函数和操作符](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0054.html)章节中介绍。
- 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)
```
