💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 9.20\. 聚集函数 _聚集函数_从一组输入值里计算一个结果。 [Table 9-46](#calibre_link-1071)和[Table 9-47](#calibre_link-1537) 显示了内建的聚集函数。聚集函数的特殊语法在[Section 4.2.7](#calibre_link-1070)里解释。 请参考[Section 2.7](#calibre_link-1357)获取额外的介绍性信息。 **Table 9-46\. 通用聚集函数** | 函数 | 参数类型 | 返回类型 | 描述 | | --- | --- | --- | --- | | `array_agg(`_expression_`)` | 任意 | 参数类型的数组 | 输入值,包括空,连接到一个数组 | | `avg(`_expression_`)` | `smallint`, `int`, `bigint`, `real`, `double precision`, `numeric`, or `interval` | 对于任何整数类型输入,结果都是`numeric`类型。 对于任何浮点输入,结果都是`double precision`类型。 否则和输入数据类型相同。 | 所有输入值的均值(算术平均) | | `bit_and(`_expression_`)` | `smallint`, `int`, `bigint`, or `bit` | 和参数数据类型相同 | 所有非 NULL 输入值的按位与(AND),如果全部输入值皆为 NULL ,那么结果也为 NULL 。 | | `bit_or(`_expression_`)` | `smallint`, `int`, `bigint`, or `bit` | 和参数数据类型相同 | 所有非 NULL 输入值的按位或(OR),如果全部输入值皆为 NULL ,那么结果也为 NULL 。 | | `bool_and(`_expression_`)` | `bool` | `bool` | 如果所有输入值都是真,则为真,否则为假。 | | `bool_or(`_expression_`)` | `bool` | `bool` | 如果至少有一个输入值为真,则为真,否则为假。 | | `count(*)` | `bigint` | 输入行数 | | `count(`_expression_`)` | 任意 | `bigint` | 计算所有输入行中满足`_expression_`不为 NULL 的行数。 | | `every(`_expression_`)` | `bool` | `bool` | 等效于`bool_and` | | `json_agg(`_record_`)` | `record` | `json` | 聚集记录作为JSON对象数组 | | `max(`_expression_`)` | 任意数组、数值、字符串、日期/时间类型 | 和参数数据类型相同 | 有输入行中`_expression_`的最大值 | | `min(`_expression_`)` | 任意数组、数值、字符串、日期/时间类型 | 和参数数据类型相同 | 所有输入行中`_expression_`的最小值 | | `string_agg(`_expression_`, `_delimiter_`)` | (`text`, `text`) or (`bytea`, `bytea`) | 和参数数据类型相同 | 输入值连接成为一个字符串,用分隔符分开 | | `sum(`_expression_`)` | `smallint`, `int`, `bigint`, `real`, `double precision`, `numeric`, or `interval` | 对于`smallint`或`int`输入,输出类型为`bigint`。 对于`bigint`输入,输出类型为`numeric`,对于浮点数输入, 输出类型为`double precision`。否则和输入数据类型相同。 | 所有输入行的`_expression_`总和。 | | `xmlagg(`_expression_`)` | `xml` | `xml` | 连接 XML 值 (也可以参阅 [Section 9.14.1.7](#calibre_link-1967)) | 请注意,除了`count`以外,这些函数在没有输入行时返回 NULL 。 尤其要指出的是`sum`函数在没有输入行时返回 NULL ,而不是零。 `array_agg`函数在没有输入行时返回null而不是空数组。 必要时可以用`coalesce`把 NULL 替换成零或空数组。 > **Note:** `bool_and`和`bool_or`布尔聚集对应标准的 SQL 聚集`every`和`any`或`some`。 对于`any`和`some`,标准语法里面似乎有些内置的歧义: > > ``` > SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...; > ``` > > 这里的`ANY`既可以被认为是引出一个子查询, 也可以被认为是一个聚集(如果子查询返回布尔值的1行的话)。因此标准的名字无法用于这些聚集。 > **Note:** 习惯了其它 SQL 数据库管理系统的用户可能被用于全表计算的`count` 的性能(之慢)惊住了。一个类似下面这样的查询: > > ``` > SELECT count(*) FROM sometable; > ``` > > 将需要努力与表的大小成正比:PostgreSQL 将需要扫面整个表或包含表中所有行的完整的索引。 聚集函数`array_agg`,`json_agg`,`string_agg` 和`xmlagg`,以及类似用户定义的聚集函数,根据输入值的顺序产生意义不同的结果值。 这个顺序默认没有指定,但是可以通过在聚集函数调用时,写一个`ORDER BY`子句来控制, 就像[Section 4.2.7](#calibre_link-1070)描述的那样。另外, 通常可以从一个已排序的子查询中提供输入值。例如: ``` SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab; ``` 但此语法在SQL标准里不允许,不能移植到其它数据库系统。 [Table 9-47](#calibre_link-1537)展示了用于统计分析的聚集函数。 单独列出这些函数仅仅是为了避免和那些经常使用的聚集函数混在一起而已。 "描述"列中的`_N_` 表示所有输入行中使得输入表达式不为 NULL 的行数。总的来说,如果计算本身变得没有意义, 那么返回值将是 NULL 。例如当`_N_`为零的时候。 **Table 9-47\. 统计聚集函数** | 函数 | 参数类型 | 返回类型 | 描述 | | --- | --- | --- | --- | | `corr(`_Y_`, `_X_`)` | `double precision` | `double precision` | 相关系数 | | `covar_pop(`_Y_`, `_X_`)` | `double precision` | `double precision` | 总体协方差 | | `covar_samp(`_Y_`, `_X_`)` | `double precision` | `double precision` | 样本协方差 | | `regr_avgx(`_Y_`, `_X_`)` | `double precision` | `double precision` | 自变量的平均值 (`sum(``_X_`)/`_N_`) | | `regr_avgy(`_Y_`, `_X_`)` | `double precision` | `double precision` | 因变量的平均值 (`sum(``_Y_`)/`_N_`) | | `regr_count(`_Y_`, `_X_`)` | `double precision` | `bigint` | 两个表达式都不为 NULL 的输入行数 | | `regr_intercept(`_Y_`, `_X_`)` | `double precision` | `double precision` | 根据所有输入的点(`_X_`, `_Y_`)按照最小二乘法拟合成一个线性方程,然后返回该直线的 Y 轴截距 | | `regr_r2(`_Y_`, `_X_`)` | `double precision` | `double precision` | 相关系数的平方 | | `regr_slope(`_Y_`, `_X_`)` | `double precision` | `double precision` | 根据所有输入的点(`_X_`, `_Y_`)按照最小二乘法拟合成一个线性方程, 然后返回该直线的斜率。 | | `regr_sxx(`_Y_`, `_X_`)` | `double precision` | `double precision` | `sum(``_X_`^2) - sum(`_X_`)^2/`_N_` (自变量的"平方和") | | `regr_sxy(`_Y_`, `_X_`)` | `double precision` | `double precision` | `sum(``_X_`*`_Y_`) - sum(`_X_`) * sum(`_Y_`)/`_N_` (自变量和因变量的"乘方积") | | `regr_syy(`_Y_`, `_X_`)` | `double precision` | `double precision` | `sum(``_Y_`^2) - sum(`_Y_`)^2/`_N_` (因变量的"平方和") | | `stddev(`_expression_`)` | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | `stddev_samp`的别名(历史原因) | | `stddev_pop(`_expression_`)` | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | 总体标准差 | | `stddev_samp(`_expression_`)` | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | 样本标准差 | | `variance`(`_expression_`) | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | `var_samp`的别名(历史原因) | | `var_pop`(`_expression_`) | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | 总体方差(总体标准差的平方) | | `var_samp`(`_expression_`) | `smallint`, `int`, `bigint`, `real`, `double precision`, 或 `numeric` | 对于浮点类型的输入返回`double precision`,其他输入返回`numeric` | 样本方差(样本标准差的平方) |