9.18. 聚合函数

从一组输入值里计算一个结果。表Table 9-42和表Table 9-43显示了内建的聚集函数。 聚集函数的特殊语法在Section 4.2.7里解释。请参考Section 2.7获取额外的介绍性信息

Table 9-42. 通用聚合函数

函数参数类型返回类型描述
array_agg(expression) any 参数类型的数组 输入值,包括空,连接到一个数组
avg(expression) smallintintbigintrealdouble precisionnumeric, orinterval 对于任何整数类型输入,结果都是numeric类型。 对于任何浮点输入,结果都是double precision类型。否则和输入数据类型相同。 所有输入值的均值(算术平均)
bit_and(expression) smallintintbigint, or bit 与参数数据类型相同 所有非 NULL 输入值的按位与(AND),如果全部输入值皆为 NULL ,那么结果也为 NULL
bit_or(expression) smallintintbigint, or bit 与参数数据类型相同 所有非 NULL 输入值的按位或(OR),如果全部输入值皆为 NULL ,那么结果也为 NULL
bool_and(expression) bool bool 如果所有输入值都是真,则为真,否则为假。
bool_or(expression) bool bool 如果至少有一个输入值为真,则为真,否则为假。
count(*) bigint输入行数
count(expression)anybigint 计算所有输入行中满足expression不为 NULL 的行数
every(expression) bool bool 等效于bool_and
max(expression)any array, numeric, string, or date/time type和参数数据类型相同 所有输入行中expression的最大值
min(expression)any array, numeric, string, or date/time type和参数数据类型相同 所有输入行中expression的最小值
string_agg(expressiondelimiter) texttext text 输入串联成一个字符串值,由分隔符分隔
sum(expression) smallintintbigintrealdouble precisionnumeric, or interval 对于smallintint输入,输出类型为bigint。对于bigint输入, 输出类型为numeric, 对于浮点数输入,输出类型为double precision。否则和输入数据类型相同。 所有输入行的expression总和。
xmlagg(expression) xml xml 连接XML值(也可以参阅Section 9.14.1.7)

请注意,除了count以外,这些函数在没有输入行时返回 NULL 。 尤其要指出的是sum函数在没有输入行时返回 NULL ,而不是零。 必要时可以用coalesce把 NULL 替换成零。

Note: bool_andbool_or布尔聚合对应标准的 SQL 聚合everyanysome。 对于anysome,标准语法里面似乎有些内置的歧义:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

这里的ANY既可以被认为是引出一个子查询,也可以被认为是一个 聚合函数(如果查询表达式返回1行的话)。因此标准的名字无法用于这些聚合。

Note: count聚合应用到整表,习惯了其它SQL数据库管理系统的用户可能会感到失望对它的性能表现。 一个类似下面这样的查询:

SELECT count(*) FROM sometable;

PostgreSQL将顺序全表扫描执行。

聚合函数array_aggstring_agg, 和xmlagg,类似用户定义的聚合函数,根据输入的值的顺序 产生有意义不同的结果值。这个顺序默认没有指定,但是可以通过在聚合函数调用时, 写一个ORDER BY子句来控制,显示在Section 4.2.7。 另外,提供从一个已排序的子查询的输入值通常会工作。例如:

SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;

但此语法在SQL标准里不允许,不能移植到其它数据库系统。

Table 9-43显示了用于统计分析的聚合函数。 (单独列出这些函数仅仅是为了避免和那些经常使用的聚集函数混在一起而已。) "描述"列中的N表示所有输入行中 使得输入表达式不为 NULL 的行数。总的来说,如果计算本身变得没有意义,那么返回值将是 NULL 。 例如当N为零的时候。

Table 9-43. 统计聚合函数

函数参数类型返回类型描述
corr(YX) double precision double precision 相关系数
covar_pop(YX) double precision double precision 总体协方差
covar_samp(YX) double precision double precision 样本协方差
regr_avgx(YX) double precision double precision 自变量的平均值 (sum(X)/N)
regr_avgy(YX) double precision double precision 因变量的平均值 (sum(X)/N)。
regr_count(YX) double precision bigint 两个表达式都不为 NULL 的输入行数
regr_intercept(YX) double precision double precision 根据所有输入的点(XY)按照最小二乘法拟合成一个线性方程, 然后返回该直线的 Y 轴截距
regr_r2(YX) double precision double precision 相关系数的平方
regr_slope(YX) double precision double precision 根据所有输入的点(XY) 按照最小二乘法拟合成一个线性方程,然后返回该直线的斜率。
regr_sxx(YX) double precision double precision sum(X^2) - sum(X)^2/N("sum of squares"of the independent variable)
regr_sxy(YX) double precision double precision sum(X*Y) - sum(X) * sum(Y)/N("sum of products"of independent times dependent variable)
regr_syy(YX) double precision double precision sum(Y^2) - sum(Y)^2/N("sum of squares"of the dependent variable)
stddev(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric stddev_samp的别名(历史原因)
stddev_pop(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric总体标准差
stddev_samp(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric样本标准差
variance(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric var_samp的别名(历史原因)
var_pop(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric总体方差(总体标准差的平方)
var_samp(expression) smallintintbigintrealdouble precision, ornumeric 对于浮点类型的输入返回double precision,其它输入返回numeric样本方差(样本标准差的平方)