Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.21. 聚合函数 #

聚合函数根据一组输入值计算单个结果。内置通用聚合函数在表 9.60中列出,而统计聚合函数在表 9.61中列出。内置组内有序集聚合函数在表 9.62中列出,而内置组内假设集函数在表 9.63中列出。与聚合函数密切相关的分组运算在表 9.64中列出。聚合函数的特殊语法注意事项在第 4.2.7 节中说明。请参阅第 2.7 节以获取其他介绍性信息。

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

虽然以下所有聚合都接受可选ORDER BY子句(如第 4.2.7 节中所述),但该子句仅添加到输出受排序影响的聚合。

表 9.60. 通用聚合函数

函数

说明

部分模式

any_value ( anyelement ) → 与输入类型相同

从非空输入值中返回一个任意值。

array_agg ( anynonarray ORDER BY input_sort_columns ) → anyarray

将所有输入值(包括空值)收集到一个数组中。

array_agg ( anyarray ORDER BY input_sort_columns ) → anyarray

将所有输入数组连接到高一维度的数组中。(输入必须具有相同维度,并且不能为空或空值。)

avg ( smallint ) → numeric

avg ( integer ) → numeric

avg ( bigint ) → numeric

avg ( numeric ) → numeric

avg ( real ) → double precision

avg ( double precision ) → double precision

avg ( interval ) → interval

计算所有非空输入值的平均值(算术平均值)。

bit_and ( smallint ) → smallint

bit_and ( integer ) → integer

bit_and ( bigint ) → bigint

bit_and ( bit ) → bit

计算所有非空输入值的按位与运算。

bit_or ( smallint ) → smallint

bit_or ( integer ) → integer

bit_or ( bigint ) → bigint

bit_or ( bit ) → bit

计算所有非空输入值的按位或运算。

bit_xor ( smallint ) → smallint

bit_xor ( integer ) → integer

bit_xor ( bigint ) → bigint

bit_xor ( bit ) → bit

计算所有非空输入值的按位异或运算。可作为一组无序值的校验和。

bool_and ( boolean ) → boolean

当所有非空输入值都为 true 时返回 true,否则返回 false。

bool_or ( boolean ) → boolean

当任何非空输入值都为 true 时返回 true,否则返回 false。

count ( * ) → bigint

计算输入行数。

count ( "any" ) → bigint

计算输入值不是空值时的输入行数。

every ( boolean ) → boolean

这是 SQL 标准相当于 bool_and

json_agg ( anyelement ORDER BY input_sort_columns ) → json

jsonb_agg ( anyelement ORDER BY input_sort_columns ) → jsonb

收集所有输入值(包括 null)到一个 JSON 数组中。值将按照 to_jsonto_jsonb 转换为 JSON。

json_agg_strict ( anyelement ) → json

jsonb_agg_strict ( anyelement ) → jsonb

收集所有输入值(跳过 null)到一个 JSON 数组中。值将按照 to_jsonto_jsonb 转换为 JSON。

json_arrayagg ( [ value_expression ] [ ORDER BY sort_expression ] [ { NULL | ABSENT } ON NULL ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ])

行为与 json_array 相同,但作为聚合函数,因此只接受一个 value_expression 参数。如果指定了 ABSENT ON NULL,则将忽略所有 NULL 值。如果指定了 ORDER BY,则元素将按该顺序出现在数组中,而不是输入顺序。

SELECT json_arrayagg(v) FROM (VALUES(2),(1)) t(v)[2, 1]

json_objectagg ( [ { key_expression { VALUE | ':' } value_expression } ] [ { NULL | ABSENT } ON NULL ] [ { WITH | WITHOUT } UNIQUE [ KEYS ] ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ])

表现形式类似于 json_object,但它是一个聚合函数,因此它只取一个 key_expression 和一个 value_expression 参数。

SELECT json_objectagg(k:v) FROM (VALUES ('a'::text,current_date),('b',current_date + 1)) AS t(k,v){ "a" : "2022-05-10", "b" : "2022-05-11" }

json_object_agg ( key "any", value "any" ORDER BY input_sort_columns ) → json

jsonb_object_agg ( key "any", value "any" ORDER BY input_sort_columns ) → jsonb

收集所有的键/值对到一个 JSON 对象中。键参数强制转换为文本;值参数按照 to_jsonto_jsonb 转换。值可以为 null,但是键不能为 null。

json_object_agg_strict ( key "any", value "any" ) → json

jsonb_object_agg_strict ( key "any", value "any" ) → jsonb

收集所有键值对至一个 JSON 对象。键参数是被转换成文本;值参数是按照 to_jsonto_jsonb 转换。键参数不能为 null。如果 value 为 null,那么该键值对会被跳过。

json_object_agg_unique ( key "any", value "any" ) → json

jsonb_object_agg_unique ( key "any", value "any" ) → jsonb

将所有键/值对收集到 JSON 对象中。键参数强制转换为文本;值参数按照 to_jsonto_jsonb 进行转换。值可以为 null,但键不能。如果存在重复键,则会引发错误。

json_object_agg_unique_strict ( key "any", value "any" ) → json

jsonb_object_agg_unique_strict ( key "any", value "any" ) → jsonb

将所有键/值对收集到 JSON 对象中。键参数强制转换为文本;值参数按照 to_jsonto_jsonb 进行转换。不能为 null。如果为 null,则会跳过该条目。如果存在重复键,则会引发错误。

max ( 请参阅文本 ) → 与输入类型相同

计算非空输入值的的最大值。可用于所有数字、字符串、日期/时间或枚举类型,以及 inetintervalmoneyoidpg_lsntidxid8 以及这些类型的数组。

min ( 请参阅文本 ) → 与输入类型相同

计算非空输入值的最小值。可用于所有数字、字符串、日期/时间或枚举类型,以及 inetintervalmoneyoidpg_lsntidxid8 以及这些类型的数组。

range_agg ( value anyrange ) → anymultirange

range_agg ( value anymultirange ) → anymultirange

计算非空输入值的并集。

range_intersect_agg ( value anyrange ) → anyrange

range_intersect_agg ( value anymultirange ) → anymultirange

计算非空输入值的对交。

string_agg ( value text, delimiter text ) → text

string_agg ( value bytea, delimiter bytea ORDER BY input_sort_columns ) → bytea

把非空输入值连接成一个字符串。第一个值后面的每个值都以相应的 delimiter (如果它不为空) 为前缀。

sum ( smallint ) → bigint

sum ( integer ) → bigint

sum ( bigint ) → numeric

sum ( numeric ) → numeric

sum ( real ) → real

sum ( double precision ) → double precision

sum ( interval ) → interval

sum ( money ) → money

计算非空输入值的总和。

xmlagg ( xml ORDER BY input_sort_columns ) → xml

连接非空 XML 输入值 (参见 第 9.15.1.8 节)。


应当注意的是,除 count 外,这些函数在没有选择任何行时返回 null 值。特别是,空行的 sum 返回 null,而不是人们期望的零,并且在没有输入行的情况下,array_agg 返回 null 而不是空数组。必要时,coalesce 函数可用于替换 null 的零或空数组。

汇总函数 array_aggjson_aggjsonb_aggjson_agg_strictjsonb_agg_strictjson_object_aggjsonb_object_aggjson_object_agg_strictjsonb_object_agg_strictjson_object_agg_uniquejsonb_object_agg_uniquejson_object_agg_unique_strictjsonb_object_agg_unique_strictstring_aggxmlagg,以及类似用户定义的汇总函数,会根据输入值顺序生成不同的结果值。默认情况下,此顺序是未指定的,但可以通过在汇总调用中编写 ORDER BY 子句来控制,如 第 4.2.7 节 中所示。或者,通常会提供来自已排序子查询的输入值。例如

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

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

注意

布尔聚合 bool_andbool_or 对应于标准 SQL 聚合 everyanysomePostgreSQL 支持 every,但不支持 anysome,因为标准语法中存在歧义

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

此处,ANY 可以看作是引入子查询或充当汇总函数(如果子查询返回带布尔值的一行)。因此,无法将标准名称赋予这些聚合。

注意

习惯于使用其他 SQL 数据库管理系统的工作人员可能会对将 count 聚合应用于整个表时的性能感到失望。像这样的查询

SELECT count(*) FROM sometable;

将根据表的大小进行相应地处理:PostgreSQL 需要扫描整个表或包含表中所有行的索引。

表 9.61 显示了通常用于统计分析中的汇总函数。(仅仅为了避免列出常用聚合而将这些函数分隔出来。)显示为接受 numeric_type 的函数可用于所有类型 smallintintegerbigintnumericrealdouble precision。如果描述中提到了 N,则表示所有输入表达式均为非 null 的输入行的数量。在所有情况下,如果计算无意义(例如,当 N 为零时),则返回 null。

表 9.61。用于统计的汇总函数

函数

说明

部分模式

corr ( Y 浮点数, X 浮点数 ) → 浮点数

计算相关系数。

covar_pop ( Y 浮点数, X 浮点数 ) → 浮点数

计算总体协方差。

covar_samp ( Y 浮点数, X 浮点数 ) → 浮点数

计算样本协方差。

regr_avgx ( Y 浮点数, X 浮点数 ) → 浮点数

计算自变量的平均值,sum(X)/N

regr_avgy ( Y 浮点数, X 浮点数 ) → 浮点数

计算因变量的平均值,sum(Y)/N

regr_count ( Y 浮点数, X 浮点数 ) → 大整数

计算两个输入值均非空的行数。

regr_intercept ( Y 浮点数, X 浮点数 ) → 浮点数

计算由 (X, Y) 对确定的最小二乘拟合线性方程的 y 轴截距。

regr_r2 ( Y 浮点数, X 浮点数 ) → 浮点数

计算相关系数的平方。

regr_slope ( Y double precision, X double precision ) → double precision

根据 (X, Y) 对求解的最平方拟合线性方程的斜率。

regr_sxx ( Y double precision, X double precision ) → double precision

计算自变量的平方和sum(X^2) - sum(X)^2/N.

regr_sxy ( Y double precision, X double precision ) → double precision

计算自变量与因变量的乘积和sum(X*Y) - sum(X) * sum(Y)/N.

regr_syy ( Y double precision, X double precision ) → double precision

计算因变量的平方和sum(Y^2) - sum(Y)^2/N.

stddev ( numeric_type ) → double precision 对于 realdouble precision,否则为 numeric

这是 stddev_samp 的历史别名。

stddev_pop ( numeric_type ) → double precision for real or double precision, otherwise numeric

计算输入值的总体标准差。

stddev_samp ( numeric_type ) → double precision for real or double precision, otherwise numeric

计算输入值的样本标准差。

variance ( numeric_type ) → double precision for real or double precision, otherwise numeric

这是 var_samp 的一个历史别名。

var_pop ( numeric_type ) → double precision for real or double precision, otherwise numeric

计算输入值的总体方差(总体标准差的平方)。

var_samp ( numeric_type ) → double precision for real or double precision, otherwise numeric

计算输入值的样本方差(样本标准差的平方)。


表 9.62 显示了使用有序集聚合语法的聚合函数。这些函数有时被称为逆分布函数。它们的聚合输入由 ORDER BY 引入,还可以同时获取未聚合的直接参数,直接参数仅计算一次。所有这些函数都忽略聚合输入中的空值。对于接受fraction 参数的函数,fraction 值必须介于 0 到 1 之间;如果不满足此条件,则会引发错误。但是,如果 fraction 参数为空,只会产生一个空结果。

表 9.62。有序集聚合函数

函数

说明

部分模式

mode () WITHIN GROUP ( ORDER BY anyelement ) → anyelement

计算最频繁的聚合参数的值的模式(如果有多个频率相同的值,则任意选择第一个)。聚合参数必须是可排序的类型。

percentile_cont ( fraction double precision ) WITHIN GROUP ( ORDER BY double precision ) → double precision

percentile_cont ( fraction double precision ) WITHIN GROUP ( ORDER BY interval ) → interval

计算连续百分比,一个对应于聚合参数值的排序集中指定fraction的值。如果需要,此值将在相邻输入项之间插值。

percentile_cont ( fractions double precision[] ) WITHIN GROUP ( ORDER BY double precision ) → double precision[]

percentile_cont ( fractions double precision[] ) WITHIN GROUP ( ORDER BY interval ) → interval[]

计算多个连续百分比。结果是一个与fractions参数具有相同维度的数组,每个非空元素以对应于该百分比的(可能的插值)值替换。

percentile_disc ( fraction double precision ) WITHIN GROUP ( ORDER BY anyelement ) → anyelement

计算离散百分比,聚合参数值的排序集中第一个在排序中的位置等于或高于指定fraction的值。聚合参数必须是可排序的类型。

percentile_disc ( fractions double precision[] ) WITHIN GROUP ( ORDER BY anyelement ) → anyarray

计算多个离散百分比。结果与 fractions 参数具有相同维度,每个非空元素都被替换为对应的该百分比的输入值。聚合参数必须为可排序类型。


每个 表 9.63 中列出的“附加表”聚合与 第 9.22 节 中定义的同名窗口函数相关联。在每种情况下,聚合结果是关联窗口函数对于从 args 构建的“附加”行,如果此行已添加到由 sorted_args 表示的有序行组中,将返回的值。对于每个此类函数,以 args 中提供的直接参数的列表必须与 sorted_args 中提供的聚合参数的数目和类型匹配。与大多数内置聚合不同,这些聚合不是严格的,即它们不会删除包含空值的输入行。空值按照 ORDER BY 子句中指定的法则进行排序。

表 9.63. 附加表聚合函数

函数

说明

部分模式

rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → bigint

计算附加行的排名,其中存在间隔;即,同类组中第一行的行号。

dense_rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → bigint

计算附加行的排名,没有间隔;此函数实际计算同类组的数量。

percent_rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → double precision

计算附加行的相对排名,即 (rank - 1) / (总行数 - 1)。因此,该值在 0 到 1 含之间。

cume_dist ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → double precision

计算累积分布,即(位于假行之前的行数或与假同行等的行数)/(总行数)。由此,值介于 1/N 和 1 之间。


表 9.64 分组操作

函数

说明

GROUPING ( group_by_expression(s) ) → integer

返回位掩码,指示当前分组集中不包含哪些 GROUP BY 表达式。从右到左分配比特,最右边的参数对应最低有效位;如果相应的表达式包含在生成当前结果行的分组集的分组条件中,则每个比特为 0,如果不包含,则为 1。


9.64 中显示的分组操作与分组集(请参阅 第 7.2.4 节)结合使用,用于区分结果行。GROUPING 函数的参数实际上没有得到计算,但它们必须与关联查询级别的 GROUP BY 子句中给出的表达式完全匹配。例如

=> 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)

在此,前四行中 grouping0 表明这两列按分组列分组方式正常分组。值为 1 表明在此前两行中没有分组 model,值为 3 表明在最后一行中既未分组 make,也未分组 model(因此是对所有输入行进行汇总)。