pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
聚合函数根据一组输入值计算出单个结果。内置聚合函数列于表 9.43和表 9.44。聚合函数的特殊语法说明见第 4.2.7 节。更多入门信息请参见第 2.7 节。
表 9.43. 通用聚合函数
| 函数 | 参数类型 | 返回类型 | 描述 |
|---|---|---|---|
array_agg( |
任意非数组类型 | 参数类型的数组 | 将输入值(包括 null)串接为数组 |
avg( |
smallint、int、bigint、real、double precision、numeric 或 interval |
整数类型参数返回 numeric,浮点参数返回 double precision,其他情况与参数数据类型相同 |
所有输入值的平均值(算术平均值) |
bit_and( |
smallint、int、bigint 或 bit |
与参数数据类型相同 | 所有非空输入值的按位与;没有非空输入时为 null |
bit_or( |
smallint、int、bigint 或 bit |
与参数数据类型相同 | 所有非空输入值的按位或;没有非空输入时为 null |
bool_and( |
bool |
bool |
所有输入值都为真时返回真,否则返回假 |
bool_or( |
bool |
bool |
至少一个输入值为真时返回真,否则返回假 |
count(*) |
bigint |
输入行数 | |
count( |
任意 | bigint |
expression 的值不为 null 的输入行数 |
every( |
bool |
bool |
等价于 bool_and |
max( |
任意数值、字符串、日期/时间、网络或枚举类型,或这些类型的数组 | 与参数类型相同 | 所有输入值中 expression 的最大值 |
min( |
任意数值、字符串、日期/时间、网络或枚举类型,或这些类型的数组 | 与参数类型相同 | 所有输入值中 expression 的最小值 |
string_agg( |
text,text |
text |
将输入值串接为字符串,以分隔符分隔 |
sum( |
smallint、int、bigint、real、double precision、numeric、interval 或 money |
smallint 或 int 参数返回 bigint,bigint 参数返回 numeric,其他情况与参数数据类型相同 |
对所有输入值的 expression 求和 |
xmlagg( |
xml |
xml |
串接 XML 值(另见第 9.14.1.7 节) |
需要注意,除了count之外,这些函数在没有选中任何行时都会返回空值。特别地,sum在没有输入行时返回空值,而不是预期中的零;array_agg在没有输入行时返回空值,而不是空数组。必要时,可以用coalesce函数把空值替换成零或空数组。
布尔聚合bool_and和bool_or对应于标准 SQL 聚合every和any或some。至于any和some,标准语法似乎存在歧义:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
此处的ANY既可以被视为引入一个子查询,也可以在该子查询返回一行布尔值时被视为聚合函数。因此,不能将标准名称用于这些聚合。
习惯于其他 SQL 数据库管理系统的用户,可能会对count聚合用于整个表时的性能感到失望。如下查询:
SELECT count(*) FROM sometable;
将由PostgreSQL通过顺序扫描整个表来执行。
聚合函数array_agg、string_agg和xmlagg,以及类似的用户定义聚合函数,其结果值会随输入值的顺序发生实质性变化。默认情况下,输入顺序未指定,但可以在聚合调用中写入ORDER BY子句来控制,如第 4.2.7 节所示。也可以用已排序的子查询提供输入值,这通常也能奏效。例如:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
但这种语法在 SQL 标准中是不允许的,并且不可移植到其他数据库系统。
表 9.44列出了统计分析常用的聚合函数。(将它们单独列出只是为了避免让更常用的聚合函数列表过于拥挤。)说明中提到的 N 表示所有输入表达式均非空的输入行数。在所有情况下,如果计算没有意义,例如 N 为零,都会返回空值。
表 9.44. 用于统计的聚合函数
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。