# 9.21.聚合函数
聚合函数从一组输入值计算单个结果。中列出了内置的通用聚合函数表9.57而统计总量则在不断增加表9.58。中列出了内置的组内有序集合聚合函数表9.59而内置的组内假设集合则在表9.60.与聚合函数密切相关的分组操作列在中表9.61。中解释了聚合函数的特殊语法注意事项第4.2.7节咨询第2.7节更多介绍信息。
聚合支持部分模式有资格参与各种优化,例如并行聚合。
表9.57.通用聚合函数
作用 描述 | 部分模式 |
---|---|
数组_agg (安诺纳雷 ) →任意数组 将所有输入值(包括空值)收集到一个数组中。 | 不 |
array_agg (任意数组 ) →任意数组 将所有输入数组连接成一个更高维度的数组。(输入必须具有相同的维度,并且不能为空或 null。) | 不 |
平均 (小字 ) →数字 平均 (整数 ) →数字 平均 (大整数 ) →数字 平均 (数字 ) →数字 平均 (真实的 ) → 双精度 平均 ( 双精度 ) → 双精度 平均 ( 间隔 ) → 间隔 计算所有非空输入值的平均值(算术平均值)。 | 是的 |
位与 ( 小字 ) → 小字 位与 ( 整数 ) → 整数 位与 ( 大整数 ) → 大整数 位与 ( 少量 ) → 少量 计算所有非空输入值的按位与。 | 是的 |
位或 ( 小字 ) → 小字 位或 ( 整数 ) → 整数 位或 ( 大整数 ) → 大整数 位或 ( 少量 ) → 少量 计算所有非空输入值的按位或。 | 是的 |
位异或 (小字 ) →小字 位异或 (整数 ) →整数 位异或 (大整数 ) →大整数 位异或 (少量 ) →少量 计算所有非空输入值的按位异或。可用作一组无序值的校验和。 | 是的 |
bool_and (布尔值 ) →布尔值 如果所有非空输入值都为真,则返回真,否则返回假。 | 是的 |
bool_or (布尔值 ) → 布尔值 如果任何非空输入值为真,则返回真,否则返回假。 | 是的 |
数数 ( * ) → 大整数 计算输入行数。 | 是的 |
数数 ( “任何” ) → 大整数 计算输入值不为空的输入行数。 | 是的 |
每一个 ( 布尔值 ) → 布尔值 这相当于 SQL 标准 bool_and . | 是的 |
json_agg ( 任何元素 ) →json jsonb_agg (任何元素 ) →jsonb 将所有输入值(包括空值)收集到 JSON 数组中。值被转换为 JSON to_json 或者to_jsonb . | 不 |
json_object_agg (钥匙 “任何” ,价值 “任何” ) →json jsonb_object_agg (钥匙 “任何” ,价值 “任何” ) →jsonb 将所有键/值对收集到一个 JSON 对象中。关键参数被强制转换为文本;值参数按 to_json 要么to_jsonb .值可以为空,但不能为键。 | 不 |
最大限度 (见文字 ) →* 与输入类型相同* 计算非空输入值的最大值。可用于任何数字、字符串、日期/时间或枚举类型,以及 网络 ,间隔 ,钱 ,样的 ,pg_lsn ,时间 ,以及任何这些类型的数组。 | 是的 |
分钟 (见文字 ) →* 与输入类型相同* 计算非空输入值的最小值。可用于任何数字、字符串、日期/时间或枚举类型,以及 网络 ,间隔 ,钱 ,样的 ,pg_lsn ,时间 ,以及任何这些类型的数组。 | 是的 |
range_agg (价值 任意范围 ) →任何多量程 计算非空输入值的并集。 | 不 |
range_intersect_agg (价值 任意范围 ) →任何多量程 计算非空输入值的交集。 | 不 |
string_agg (价值 文本 ,分隔符 文本 ) →文本 string_agg (价值 拜茶 ,分隔符 拜茶 ) →拜茶 将非空输入值连接成一个字符串。第一个值之后的每个值前面都有相应的* 分隔符 *(如果它不为空)。 | 不 |
和 (小字 ) → 大整数 和 ( 整数 ) → 大整数 和 ( 大整数 ) → 数字 和 ( 数字 ) → 数字 和 ( 真实的 ) → 真实的 和 ( 双精度 ) → 双精度 和 ( 间隔 ) →间隔 和 (钱 ) →钱 计算非空输入值的总和。 | 是的 |
xmlagg (xml ) →xml 连接非空 XML 输入值(请参阅第 9.15.1.7 节)。 | 不 |
需要注意的是,除了数数
,当没有选择行时,这些函数返回空值。尤其,和
of no rows 返回 null,而不是预期的零,并且array_agg
当没有输入行时返回 null 而不是空数组。这合并
必要时,函数可用于将零或空数组替换为 null。
聚合函数array_agg
,json_agg
,jsonb_agg
,json_object_agg
,jsonb_object_agg
,string_agg
, 和xmlagg
,以及类似的用户定义的聚合函数,根据输入值的顺序产生有意义的不同结果值。默认情况下未指定此顺序,但可以通过编写订购方式
聚合调用中的子句,如图所示第 4.2.7 节.或者,从排序的子查询中提供输入值通常会起作用。例如:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
请注意,如果外部查询级别包含附加处理(例如连接),则此方法可能会失败,因为这可能会导致子查询的输出在计算聚合之前重新排序。
# 笔记
布尔聚合bool_and
和bool_or
对应于标准 SQL 聚合每一个
和任何
要么一些
.PostgreSQL 支持每一个
, 但不是任何
或者一些
,因为标准语法中存在歧义:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
这里任何
如果子查询返回具有布尔值的一行,则可以将其视为引入子查询或聚合函数。因此,不能为这些集合指定标准名称。
# 笔记
习惯于使用其他 SQL 数据库管理系统的用户可能会对它的性能感到失望。数数
当它应用于整个表时聚合。像这样的查询:
SELECT count(*) FROM sometable;
将需要与表大小成比例的工作量:PostgreSQL 将需要扫描整个表或包含表中所有行的整个索引。
表 9.58显示了通常用于统计分析的聚合函数。(这些被分开只是为了避免使更常用的聚合列表变得混乱。)显示为接受的函数*数字类型
适用于所有类型小字
,整数
,大整数
,数字
,真实的
, 和双精度
.描述提到的地方N
,表示所有输入表达式均为非空的输入行数。在所有情况下,如果计算没有意义,例如N
*是零。
表9.58.统计的聚合函数
表9.59显示了使用有序集聚合语法。这些函数有时被称为“逆分布”函数。他们的总投入由订购人
,他们也可能会直接论点它不是聚合的,而是只计算一次。所有这些函数都会忽略聚合输入中的空值。对于那些需要*小部分
参数,分数值必须介于0和1之间;否则会抛出错误。然而,一个空的小部分
*值只会生成一个空结果。
表9.59.有序集合聚合函数
列出的每个“假设集”聚合表 9.60与定义的同名窗口函数相关联第 9.22 节.在每种情况下,聚合的结果都是关联的窗口函数将为从构造的“假设”行返回的值*参数
,如果这样的行已添加到由排序参数
.对于这些函数中的每一个,给出的直接参数列表参数
必须与给出的聚合参数的数量和类型相匹配排序参数
*。与大多数内置聚合不同,这些聚合并不严格,也就是说,它们不会删除包含空值的输入行。空值根据中指定的规则进行排序订购人
条款
表9.60.假设集合聚合函数
表9.61.分组操作
作用 描述 |
---|
分组 ( 按表达式分组 ) → 整数 返回一个位掩码,指示 分组 表达式不包括在当前分组集中。位被分配与最低有效位对应的最右边的参数;如果生成当前结果行的分组集的分组条件中包含相应的表达式,则每一位为0,如果不包含,则每一位为1. |
中显示的分组操作表9.61与分组集一起使用(请参见第7.2.4节)以区分结果行。争论的焦点分组
函数没有实际求值,但它们必须与分组
关联查询级别的子句。例如:
=> SELECT * FROM items_sold;
make | model | sales