9.20. 汇总函数

聚合函数根据一组 Importing 值计算单个结果。内置的通用汇总函数在Table 9.52中列出,统计汇总在Table 9.53中列出。 Table 9.54中列出了内置的组内有序集聚合函数,而Table 9.55列出了内置的组内假设集函数。 Table 9.56中列出了与聚合函数紧密相关的分组操作。 Section 4.2.7中解释了聚合函数的特殊语法注意事项。有关其他入门信息,请咨询Section 2.7

表 9.52. 通用集合函数

FunctionArgument Type(s)Return TypePartial ModeDescription
array_agg(expression)任何非数组类型参数类型的数组NoImporting 值(包括空值)串联到一个数组中
array_agg(expression)任何数组类型与参数数据类型相同NoImporting 数组级联成一个高维数组(Importing 必须全部具有相同的维数,并且不能为空或 null)
avg(expression)smallintintbigintrealdouble precisionnumericintervalnumeric表示任何整数类型的参数,double precision表示浮点参数,否则与参数数据类型相同Yes所有非空 Importing 值的平均值(算术平均值)
bit_and(expression)smallintintbigintbit与参数数据类型相同Yes所有非空 Importing 值的按位与,如果没有则为 null
bit_or(expression)smallintintbigintbit与参数数据类型相同Yes所有非空 Importing 值的按位或,如果没有则为 null
bool_and(expression)boolboolYes如果所有 Importing 值均为 true,则为 true,否则为 false
bool_or(expression)boolboolYes如果至少一个 Importing 值是 true,则为 true,否则为 false
count(*) bigintYesImporting 行数
count(expression)anybigintYes* expression *的值不为空的 Importing 行数
every(expression)boolboolYes相当于bool_and
json_agg(expression)anyjsonNo将值(包括空值)聚合为 JSON 数组
jsonb_agg(expression)anyjsonbNo将值(包括空值)聚合为 JSON 数组
json_object_agg(name, value)(any, any)jsonNo将名称/值对聚合为 JSON 对象;值可以为 null,但不能为名称
jsonb_object_agg(name, value)(any, any)jsonbNo将名称/值对聚合为 JSON 对象;值可以为 null,但不能为名称
max(expression)任何数字,字符串,日期/时间,网络或枚举类型,或这些类型的数组与参数类型相同Yes所有非空 Importing 值中的最大值* expression *
min(expression)任何数字,字符串,日期/时间,网络或枚举类型,或这些类型的数组与参数类型相同Yes所有非空 Importing 值中的最小值* expression *
string_agg(expression, delimiter)(texttext)或(byteabytea)与参数类型相同No非空 Importing 值串联成一个字符串,用定界符分隔
sum(expression)smallintintbigintrealdouble precisionnumericintervalmoneybigint用于smallintint参数,numeric用于bigint参数,否则与参数数据类型相同Yes所有非空 Importing 值的* expression *之和
xmlagg(expression)xmlxmlNo非空 XML 值的串联(另请参见Section 9.14.1.7)

应该注意的是,除了count,当没有选择任何行时,这些函数将返回空值。特别是,没有行的sum返回的是 null,而不是像人们期望的那样为零,并且当没有 Importing 行时,array_agg返回的是 null 而不是空数组。必要时,coalesce函数可用于将零或空数组替换为 null。

支持部分模式的聚合函数有资格参与各种优化,例如并行聚合。

Note

布尔集合bool_andbool_or对应于标准 SQL 集合everyanysome。对于anysome,似乎在标准语法中内置了歧义:

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

如果子查询返回带有布尔值的一行,则ANY可以视为引入子查询,也可以视为聚合函数。因此,无法为这些聚合指定标准名称。

Note

count聚合应用于整个表时,习惯于使用其他 SQL 数据库 Management 系统的用户可能会感到失望。查询如下:

SELECT count(*) FROM sometable;

将需要与表大小成比例的工作量:PostgreSQL 将需要扫描整个表或扫描包括表中所有行的索引的整个表。

聚合函数array_aggjson_aggjsonb_aggjson_object_aggjsonb_object_aggstring_aggxmlagg以及类似的用户定义的聚合函数根据 Importing 值的 Sequences 产生有意义的不同结果值。默认情况下未指定此 Sequences,但是可以通过在聚合调用中编写ORDER BY子句来控制该 Sequences,如Section 4.2.7所示。或者,通常可以从已排序的子查询中提供 Importing 值。例如:

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

请注意,如果外部查询级别包含其他处理(例如联接),则此方法可能会失败,因为这可能导致子查询的输出在计算聚合之前重新排序。

Table 9.53显示了通常用于统计分析的聚合函数。 (将它们分开是为了避免使更常用的聚合列表混乱.)在描述中提到* N 时,表示所有 Importing 表达式都不为空的 Importing 行数。在所有情况下,如果计算无意义,例如 N *为零,则返回 null。

表 9.53. 统计汇总功能

FunctionArgument TypeReturn TypePartial ModeDescription
corr(Y, X)double precisiondouble precisionYescorrelation coefficient
covar_pop(Y, X)double precisiondouble precisionYespopulation covariance
covar_samp(Y, X)double precisiondouble precisionYessample covariance
regr_avgx(Y, X)double precisiondouble precisionYes自变量的平均值(sum(X)/N)
regr_avgy(Y, X)double precisiondouble precisionYes因变量的平均值(sum(Y)/N)
regr_count(Y, X)double precisionbigintYes两个表达式都不为空的 Importing 行数
regr_intercept(Y, X)double precisiondouble precisionYes由(* X Y *)对确定的最小二乘拟合线性方程的 y 截距
regr_r2(Y, X)double precisiondouble precisionYes相关系数的平方
regr_slope(Y, X)double precisiondouble precisionYes由(* X Y *)对确定的最小二乘拟合线性方程的斜率
regr_sxx(Y, X)double precisiondouble precisionYessum(X^2) - sum(X)^2/N(自变量的“平方和”)
regr_sxy(Y, X)double precisiondouble precisionYessum(X*Y) - sum(X) * sum(Y)/N(独立时间因变量的“产品总和”)
regr_syy(Y, X)double precisiondouble precisionYessum(Y^2) - sum(Y)^2/N(因变量的“平方和”)
stddev(expression)smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesstddev_samp的历史别名
stddev_pop(expression)smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesImporting 值的总体标准偏差
stddev_samp(expression)smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesImporting 值的 samples 标准偏差
variance ( expression )smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesvar_samp的历史别名
var_pop ( expression )smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesImporting 值的总体方差(总体标准差的平方)
var_samp ( expression )smallintintbigintrealdouble precisionnumericdouble precision用于浮点参数,否则numericYesImporting 值的 samples 方差(samples 标准偏差的平方)

Table 9.54显示了一些使用“有序集合聚合”语法的聚合函数。这些函数有时称为“逆分布”函数。

表 9.54. 有序集合聚合函数

Function直接参数类型汇总参数类型Return TypePartial ModeDescription
mode() WITHIN GROUP (ORDER BY sort_expression)任何可排序的类型与排序表达式相同No返回最频繁的 Importing 值(如果有多个相同频繁的结果,则任意选择第一个)
percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression)double precisiondouble precisioninterval与排序表达式相同No连续百分位数:返回对应于 Sequences 中指定分数的值,如果需要,在相邻 Importing 项之间进行插值
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)double precision[]double precisioninterval排序表达式类型的数组No多个连续百分位数:返回与* fractions *参数形状匹配的结果数组,每个非 null 元素替换为与该百分位数相对应的值
percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)double precision任何可排序的类型与排序表达式相同No离散百分位数:返回第一个 Importing 值,该值在 Sequences 中的位置等于或超过指定的分数
percentile_disc(fractions) WITHIN GROUP (ORDER BY sort_expression)double precision[]任何可排序的类型排序表达式类型的数组No多个离散百分比:返回与* fractions *参数形状匹配的结果数组,每个非 null 元素均替换为与该百分比对应的 Importing 值

Table 9.54中列出的所有聚合在其排序的 Importing 中都将忽略空值。对于带有* fraction *参数的变量,分数值必须在 0 到 1 之间;如果没有,则会引发错误。但是,空分数值只会产生空结果。

Table 9.55中列出的每个集合都与Section 9.21中定义的同名窗口函数相关联。在每种情况下,如果将这样的行添加到根据* sorted_args 计算出的行的已排序组中,则汇总结果就是相关窗口函数针对从 args *构造的“假设”行返回的值。

表 9.55. 假设集合集合函数

Function直接参数类型汇总参数类型Return TypePartial ModeDescription
rank(args) WITHIN GROUP (ORDER BY sorted_args)VARIADIC "any"VARIADIC "any"bigintNo假设行的等级,重复行之间有间隔
dense_rank(args) WITHIN GROUP (ORDER BY sorted_args)VARIADIC "any"VARIADIC "any"bigintNo假设行的等级,无间隙
percent_rank(args) WITHIN GROUP (ORDER BY sorted_args)VARIADIC "any"VARIADIC "any"double precisionNo假设行的相对等级,范围从 0 到 1
cume_dist(args) WITHIN GROUP (ORDER BY sorted_args)VARIADIC "any"VARIADIC "any"double precisionNo假设行的相对等级,范围为 1/* N *到 1

对于这些假设集合的每个集合,* args 中给出的直接参数列表必须与 sorted_args *中给出的聚合参数的数量和类型匹配。与大多数内置聚合不同,这些聚合并不严格,即它们不会删除包含空值的 Importing 行。空值根据ORDER BY子句中指定的规则排序。

表 9.56. 分组操作

FunctionReturn TypeDescription
GROUPING(args...)integer整数位掩码,指示哪些参数未包含在当前分组集中

分组操作与分组集(请参阅Section 7.2.4)结合使用以区分结果行。实际不会评估GROUPING操作的参数,但它们必须与关联的查询级别的GROUP BY子句中给出的表达式完全匹配。位分配时,最右边的参数是最低有效位;如果将相应的表达式包含在生成结果行的分组集的分组条件中,则每个位为 0;否则为 1.例如:

=> SELECT * FROM items_sold;
 make  | model | sales
-------+-------+-------
 Foo   | GT    |  10
 Foo   | Tour  |  20
 Bar   | City  |  15
 Bar   | Sport |  5
(4 rows)

=> SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
 make  | model | grouping | sum
-------+-------+----------+-----
 Foo   | GT    |        0 | 10
 Foo   | Tour  |        0 | 20
 Bar   | City  |        0 | 15
 Bar   | Sport |        0 | 5
 Foo   |       |        1 | 30
 Bar   |       |        1 | 20
       |       |        3 | 50
(7 rows)