On this page
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. 通用集合函数
Function | Argument Type(s) | Return Type | Partial Mode | Description |
---|---|---|---|---|
array_agg(expression) |
任何非数组类型 | 参数类型的数组 | No | Importing 值(包括空值)串联到一个数组中 |
array_agg(expression) |
任何数组类型 | 与参数数据类型相同 | No | Importing 数组级联成一个高维数组(Importing 必须全部具有相同的维数,并且不能为空或 null) |
avg(expression) |
smallint ,int ,bigint ,real ,double precision ,numeric 或interval |
numeric 表示任何整数类型的参数,double precision 表示浮点参数,否则与参数数据类型相同 |
Yes | 所有非空 Importing 值的平均值(算术平均值) |
bit_and(expression) |
smallint ,int ,bigint 或bit |
与参数数据类型相同 | Yes | 所有非空 Importing 值的按位与,如果没有则为 null |
bit_or(expression) |
smallint ,int ,bigint 或bit |
与参数数据类型相同 | Yes | 所有非空 Importing 值的按位或,如果没有则为 null |
bool_and(expression) |
bool |
bool |
Yes | 如果所有 Importing 值均为 true,则为 true,否则为 false |
bool_or(expression) |
bool |
bool |
Yes | 如果至少一个 Importing 值是 true,则为 true,否则为 false |
count(*) |
bigint |
Yes | Importing 行数 | |
count(expression) |
any | bigint |
Yes | * expression *的值不为空的 Importing 行数 |
every(expression) |
bool |
bool |
Yes | 相当于bool_and |
json_agg(expression) |
any |
json |
No | 将值(包括空值)聚合为 JSON 数组 |
jsonb_agg(expression) |
any |
jsonb |
No | 将值(包括空值)聚合为 JSON 数组 |
json_object_agg(name, value) |
(any, any) |
json |
No | 将名称/值对聚合为 JSON 对象;值可以为 null,但不能为名称 |
jsonb_object_agg(name, value) |
(any, any) |
jsonb |
No | 将名称/值对聚合为 JSON 对象;值可以为 null,但不能为名称 |
max(expression) |
任何数字,字符串,日期/时间,网络或枚举类型,或这些类型的数组 | 与参数类型相同 | Yes | 所有非空 Importing 值中的最大值* expression * |
min(expression) |
任何数字,字符串,日期/时间,网络或枚举类型,或这些类型的数组 | 与参数类型相同 | Yes | 所有非空 Importing 值中的最小值* expression * |
string_agg(expression, delimiter) |
(text ,text )或(bytea ,bytea ) |
与参数类型相同 | No | 非空 Importing 值串联成一个字符串,用定界符分隔 |
sum(expression) |
smallint ,int ,bigint ,real ,double precision ,numeric ,interval 或money |
bigint 用于smallint 或int 参数,numeric 用于bigint 参数,否则与参数数据类型相同 |
Yes | 所有非空 Importing 值的* expression *之和 |
xmlagg(expression) |
xml |
xml |
No | 非空 XML 值的串联(另请参见Section 9.14.1.7) |
应该注意的是,除了count
,当没有选择任何行时,这些函数将返回空值。特别是,没有行的sum
返回的是 null,而不是像人们期望的那样为零,并且当没有 Importing 行时,array_agg
返回的是 null 而不是空数组。必要时,coalesce
函数可用于将零或空数组替换为 null。
支持部分模式的聚合函数有资格参与各种优化,例如并行聚合。
Note
Note
将count
聚合应用于整个表时,习惯于使用其他 SQL 数据库 Management 系统的用户可能会感到失望。查询如下:
SELECT count(*) FROM sometable;
将需要与表大小成比例的工作量:PostgreSQL 将需要扫描整个表或扫描包括表中所有行的索引的整个表。
聚合函数array_agg
,json_agg
,jsonb_agg
,json_object_agg
,jsonb_object_agg
,string_agg
和xmlagg
以及类似的用户定义的聚合函数根据 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. 统计汇总功能
Table 9.54显示了一些使用“有序集合聚合”语法的聚合函数。这些函数有时称为“逆分布”函数。
表 9.54. 有序集合聚合函数
Table 9.54中列出的所有聚合在其排序的 Importing 中都将忽略空值。对于带有* fraction
*参数的变量,分数值必须在 0 到 1 之间;如果没有,则会引发错误。但是,空分数值只会产生空结果。
Table 9.55中列出的每个集合都与Section 9.21中定义的同名窗口函数相关联。在每种情况下,如果将这样的行添加到根据* sorted_args
计算出的行的已排序组中,则汇总结果就是相关窗口函数针对从 args
*构造的“假设”行返回的值。
表 9.55. 假设集合集合函数
对于这些假设集合的每个集合,* args
中给出的直接参数列表必须与 sorted_args
*中给出的聚合参数的数量和类型匹配。与大多数内置聚合不同,这些聚合并不严格,即它们不会删除包含空值的 Importing 行。空值根据ORDER BY
子句中指定的规则排序。
表 9.56. 分组操作
分组操作与分组集(请参阅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)