
# 聚合函数
本文介绍聚合函数的语法规则，包括参数解释、函数示例等。
#### 函数列表
表1聚合函数 
| 函数                                                                                                                                                                                        | 描述                              |
|:---|:---|
| [approx_distinct函数]     | 用于估算x中不重复值的个数。                  |
| [approx_percentile函数] | 用于对x进行正序排列，返回处于percentage位置的数值。 |
| [arbitrary函数]           | 用于返回x中任意一个非空的值。                 |
| [bool_and函数]                                                                                                            | 检查所有行是否满足布尔条件（等价于every）。        |
| [max_by函数]            | 查询y为最大值时对应的x值，或查询最大的n个y值对应的x值。  |
| [min_by函数]                                                                       | 查询y为最小值时对应的x值，或查询最小的n个y值对应的x值。  |
| [count函数]              | 用于计数。                           |
| [max函数]                | 用于查询x中最大的值。                     |
| [min函数]              | 用于查询x中最小值。                      |
| [avg函数]                 | 用于计算x的算术平均值。                    |
   
 #### approx_distinct函数
用于估算x中不重复值的个数。
- 估算x中不重复值的个数，默认存在2.3%的标准误差 语法：approx_distinct(x)
  
- 估算x中不重复值的个数，支持自定义标准误差 语法：approx_distinct(x, e)
  
表2参数说明 
| 参数名称 | 描述      | 类型                           | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段    | 任意                           | 是    |
| e    | 自定义标准误差 | double类型，取值为\[0.0115, 0.26\] | 否    |
   
返回值类型：bigint类型
- 示例1：使用approx_distinct函数估算不重复的clientIp字段值，标准误差为2.3%。
  表3查询分析结果 
  | 类型 | 查询语句                             | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT approx_distinct(clientIp) | 1    |
     
  

- 示例2：使用approx_distinct函数估算不重复的clientIp字段值， 自定义标准误差为10%。
  表4查询分析结果 
  | 类型 | 查询语句                                  | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT approx_distinct(clientIp, 0.1) | 1    |
     
  
 #### approx_percentile函数
用于对x进行正序排列，返回处于percentage位置的数值。
- 对于x进行正序排列，返回处于percentage位置的x，返回结果为double类型。 语法：approx_percentile(x, percentage)
  
- 对x进行正序排列，返回处于percentage01、percentage02位置的x，返回结果为array(double,double)类型。 语法：approx_percentile(x, array\[percentage01, percentage02)\]
  
- 对x和权重的乘积进行正序排列，返回大约处于percentage位置的x，返回结果为double类型。 语法：approx_percentile(x, weight, percentage)
  
- 对x和权重的乘积进行正序排列，返回处于percentage01、percentage02位置的x，返回结果为array(double,double)类型。 语法：approx_percentile(x, weight, array\[percentage01, percentage02...\])
  
- 对x和权重的乘积进行正序排列，返回大约处于percentage位置的x，返回结果为double类型。支持设置返回结果的准确度。 语法：approx_percentile(x, weight, percentage, accuracy)
  
表5参数说明 
| 参数名称       | 描述                                | 类型     | 是否必选 |
|:---|:---|:---|:---|
| x          | 原始字段                              | double | 是    |
| percentage | 百分比值，取值范围为\[0,1\]。                | double | 是    |
| weight     | 权重，大于1的整数。 设置权重后，系统根据x与权重的乘积进行排序。 | int    | 否    |
| accuracy   | 准确度，取值范围为(0,1)。                   | double | 否    |
   
返回值类型：double类型或array(double,...,double)类型
- 示例1：对request_time列进行排序后，返回大约处于50%位置的request_time字段的值。
  表6查询分析结果 
  | 类型 | 查询语句                                        | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT approx_percentile(request_time, 0.5) | 45.0 |
     
  

- 示例2：对request_time列进行排序后，返回处于10%、20%及70%位置的request_time字段的值。
  表7查询分析结果 
  | 类型 | 查询语句                                                        | 返回结果                 |
  |:---|:---|:---|
  | 场景 | SELECT approx_percentile(request_time,array\[0.1,0.2,0.7\]) | \[17.0, 24.0, 59.0\] |
     
  

- 示例3：根据request_time与权重的乘积对request_time列进行排序后，返回大约处于50%位置的request_time字段的值, 权重值为60。
  表8查询分析结果 
  | 类型 | 查询语句                                            | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT approx_percentile(request_time, 60, 0.5) | 45.0 |
     
  

- 示例4：根据request_time与权重的乘积对request_time列进行排序后，返回大约处于80%和90%位置的request_time字段的值，权重值为60。
  表9查询分析结果 
  | 类型 | 查询语句                                                          | 返回结果          |
  |:---|:---|:---|
  | 场景 | SELECT approx_percentile(request_time, 60, array\[0.8, 0.9\]) | \[66.0,73.0\] |
     
  

- 示例5：根据request_time与权重的乘积对request_time列进行排序后，返回大约处于50%位置的request_time字段的值，权重值为60，准确度为0.2。
  表10查询分析结果 
  | 类型 | 查询语句                                                 | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT approx_percentile(request_time, 60, 0.5, 0.2) | 45.0 |
     
  
 
 #### arbitrary函数
用于返回x中任意一个非空的值。
语法：arbitrary(x)
表11参数说明 
| 参数名称 | 描述    | 类型 | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。 | 任意 | 是    |
   
返回值类型：与参数值的数据类型一致。
示例：select arbitrary(region)
表12查询分析结果 
| 类型 | 查询语句              | 返回结果 |
|:---|:---|:---|
| 场景 | arbitrary(region) | r2   |
   
 #### bool_and函数
bool_and是Trino中用于**对一组布尔值执行逻辑与（AND）聚合操作**的聚合函数。它返回一个布尔值，表示输入中所有非NULL值是否均为TRUE。若任意一个非NULL值为FALSE，或输入中均为NULL值，则返回FALSE。该函数适用于需要判断"所有条件是否都满足"的场景，常用于数据验证、状态检查、规则匹配等业务逻辑。
语法：bool_and(x)
表13参数说明 
| 参数名称 | 描述               | 类型      | 是否必选 |
|:---|:---|:---|:---|
| x    | 要进行逻辑与聚合的布尔表达式或列 | BOOLEAN | 是    |
   
返回值类型：BOOLEAN
- 若所有非NULL值均为TRUE，则返回TRUE。
- 若存在至少一个非NULL值为FALSE，则返回FALSE。
- 若所有值均为NULL，则返回FALSE。
示例：\* \| select method , bool_and(status \>= 500) as all_error group by method
表14查询分析结果 
| 类型                                                                                         | 查询语句   | 返回结果      |
|:---|:---|:---|
| 场景     | method | all_error |
| 场景     | DELETE | true      |
| 场景     | PUT    | false     |
| 场景     | POST   | false     |
| 场景     | GET    | false     |
   
 #### max_by函数
查询y为最大值时对应的x值，或查询最大的n个y值对应的x值。
- 查询y为最大值时对应的x值。 语法：max_by(x, y)
  
- 查询最大的n个y值对应的x值。 语法：max_by(x, y, n)
  
表15参数说明 
| 参数名称 | 描述      | 类型     | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。   | 任意数据类型 | 是    |
| y    | 原始字段。   | 任意数据类型 | 是    |
| n    | 大于0的整数。 | int    | 否    |
   
返回值类型：与参数值的数据类型一致。
- 示例1：统计请求时长最大时对应的请求方法。
  表16查询分析结果 
  | 类型 | 查询语句                                        | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT max_by(request_method, request_time) | GET  |
     
  

- 示例2：统计请求时长最大的3个请求对应的请求方法。
  表17查询分析结果 
  | 类型 | 查询语句                                           | 返回结果                  |
  |:---|:---|:---|
  | 场景 | SELECT max_by(request_method, request_time, 3) | \["GET","GET","GET"\] |
     
  
 
 #### min_by函数
查询y为最小值时对应的x值，或查询最小的n个y值对应的x值。
- 查询y为最小值时对应的x值。 语法：min_by(x, y)
  
- 查询最小的n个y值对应的x值。 语法：min_by(x, y, n)
  
表18参数说明 
| 参数名称 | 描述      | 类型     | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。   | 任意数据类型 | 是    |
| y    | 原始字段。   | 任意数据类型 | 是    |
| n    | 大于0的整数。 | int    | 否    |
   
返回值类型：与参数值的数据类型一致
- 示例1：统计请求时长最小时对应的请求方法。
  表19查询分析结果 
  | 类型 | 查询语句                                        | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT min_by(request_method, request_time) | POST |
     
  
- 示例2：统计请求时长最小的3个请求对应的请求方法。
  表20查询分析结果 
  | 类型 | 查询语句                                           | 返回结果                     |
  |:---|:---|:---|
  | 场景 | SELECT min_by(request_method, request_time, 3) | \["POST","POST","POST"\] |
     
  
 
 #### count函数
用于计数。
- 统计所有的日志条数。 语法：COUNT(\*)
  
- 统计所有的日志条数。等同于count(\*)。 语法：COUNT(1)
  
- 统计x中值不为NULL的日志条数。 语法：COUNT(x)
  
表21参数说明 
| 参数名称 | 描述    | 类型 | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。 | 任意 | 是    |
   
返回值类型：int
示例：select COUNT(\*)
表22查询分析结果 
| 类型 | 查询语句      | 返回结果 |
|:---|:---|:---|
| 场景 | COUNT(\*) | 1    |
   
 #### max函数
用于查询x中最大的值。
- 查询x中最大的值。 语法：max(x)
  
- 查询x中最大的n个值，结果返回为数组。 语法： max(x, n)
  
表23参数说明 
| 参数名称 | 描述       | 类型   | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。    | 任意数据 | 是    |
| n    | 返回最大值的个数 | 正整数  | 否    |
   
返回值类型：与参数值的数据类型一致。
- 示例1：查询x中的最大值
  表24查询分析结果 
  | 类型 | 查询语句          | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT max(x) | 99.0 |
     
  
- 示例2：查询x中的最大的2个值
  表25查询分析结果 
  | 类型 | 查询语句             | 返回结果           |
  |:---|:---|:---|
  | 场景 | SELECT max(x, 2) | \[99.0, 99.0\] |
     
  
 
 #### min函数
用于查询x中最小值。
- 查询x中最小的值。 语法：min(x)
  
- 查询x中最小的n个值，结果返回为数组。 语法： min(x, n)
  
表26参数说明 
| 参数名称 | 描述       | 类型   | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。    | 任意数据 | 是    |
| n    | 返回最小值的个数 | 正整数  | 否    |
   
返回值类型：与参数值的数据类型一致。
- 示例1：查询x中的最小值
  表27查询分析结果 
  | 类型 | 查询语句          | 返回结果 |
  |:---|:---|:---|
  | 场景 | SELECT min(x) | 10.0 |
     
  
- 示例2：查询x中的最小的2个值
  表28查询分析结果 
  | 类型 | 查询语句             | 返回结果           |
  |:---|:---|:---|
  | 场景 | SELECT min(x, 2) | \[10.0, 10.0\] |
     
  
 
 #### avg函数
用于计算x的算术平均值。
语法：AVG(x)
表29参数说明 
| 参数名称 | 描述    | 类型     | 是否必选 |
|:---|:---|:---|:---|
| x    | 原始字段。 | number | 是    |
   
返回值类型：double
示例：select AVG(value)
表30查询分析结果 
| 类型 | 查询语句       | 返回结果 |
|:---|:---|:---|
| 场景 | AVG(value) | 1    |
   
