# 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 数组中。值被转换为 JSONto_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_andbool_or对应于标准 SQL 聚合每一个任何要么一些.PostgreSQL 支持每一个, 但不是任何或者一些,因为标准语法中存在歧义:

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

这里任何如果子查询返回具有布尔值的一行,则可以将其视为引入子查询或聚合函数。因此,不能为这些集合指定标准名称。

# 笔记

习惯于使用其他 SQL 数据库管理系统的用户可能会对它的性能感到失望。数数当它应用于整个表时聚合。像这样的查询:

SELECT count(*) FROM sometable;

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

表 9.58显示了通常用于统计分析的聚合函数。(这些被分开只是为了避免使更常用的聚合列表变得混乱。)显示为接受的函数*数字类型适用于所有类型小字,整数,大整数,数字,真实的, 和双精度.描述提到的地方N,表示所有输入表达式均为非空的输入行数。在所有情况下,如果计算没有意义,例如N*是零。

表9.58.统计的聚合函数

作用

描述
部分模式
科尔(Y 双精度,十、 双精度) →双精度

计算相关系数。
科瓦鲁波普(Y 双精度,十、 双精度) →双精度

计算总体协方差。
科瓦鲁桑普 ( Y 双精度, 十、 双精度 ) → 双精度

计算样本协方差。
regr_avgx ( Y 双精度, 十、 双精度 ) → 双精度

计算自变量的平均值,总数(*十、*)/*N*.
再加上 ( Y 双精度, 十、 双精度 ) → 双精度

计算因变量的平均值,总数(*Y*)/*N*.
重新计数 ( Y 双精度, 十、 双精度 ) → 比基特

计算两个输入均为非空的行数。
重新拦截 ( Y 双精度, 十、 双精度 ) → 双精度

计算由以下公式确定的最小二乘拟合线性方程的y截距:(十、, Y)成对的。
regr_r2 ( Y 双精度, 十、 双精度 ) → 双精度

计算相关系数的平方。
再加坡 ( Y 双精度, 十、 双精度 ) → 双精度

计算由以下公式确定的最小二乘拟合线性方程的斜率:(十、, Y)成对的。
regr_sxx ( Y 双精度, 十、 双精度 ) → 双精度

计算自变量的“平方和”,总数(*十、*^2) -总和(*十、*)^2/*N*.
regr_sxy ( Y 双精度, 十、 双精度 ) → 双精度

计算独立变量乘以因变量的“乘积之和”,总数(*十、***Y*)-总和(*十、*)*总和(*Y*)/*N*.
抱歉 ( Y 双精度, 十、 双精度 ) → 双精度

计算因变量的“平方和”,总数(*Y*^2) -总和(*Y*)^2/*N*.
标准偏差 ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

这是一个历史上的别名stddev_samp.|是的
stddev_pop ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

计算输入值的总体标准偏差对
stddev_samp ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

计算输入值的样本标准偏差对
方差 ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

这是一个历史上的别名var_samp.|是的
var_pop ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

计算输入值的总体方差(总体标准偏差的平方)。|对
var_samp ( 数字型 ) → `` 双精度对于真实的双精度否则数字的

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

表9.59显示了使用有序集聚合语法。这些函数有时被称为“逆分布”函数。他们的总投入由订购人,他们也可能会直接论点它不是聚合的,而是只计算一次。所有这些函数都会忽略聚合输入中的空值。对于那些需要*小部分参数,分数值必须介于0和1之间;否则会抛出错误。然而,一个空的小部分*值只会生成一个空结果。

表9.59.有序集合聚合函数

作用

描述
部分模式
模式 () 组内 ( 订购人 任何元素 ) → 任何元素

计算模式,聚合参数的最频繁值(如果有多个相同频率的值,可任意选择第一个)。聚合参数必须是可排序类型。
百分位数(续) ( 小部分 双精度 ) 组内 ( 订购人 双精度) →双精度

percentile_cont(分数 双精度)组内(订购方式 间隔) →间隔

计算连续百分位数, 对应于指定的值*分数*在有序的聚合参数值集中。如果需要,这将在相邻输入项之间进行插值。
percentile_cont(分数 双精度[])组内(订购方式 双精度) →双精度[]

percentile_cont(分数 双精度[])组内(订购方式 间隔) →间隔[]

计算多个连续百分位数。结果是一个与*分数*参数,每个非空元素都替换为对应于该百分位数的(可能是内插的)值。
percentile_disc(分数 双精度)组内(订购方式 任何元素) →任何元素

计算离散百分位数, 有序集合参数值中的第一个值,其在排序中的位置等于或超过指定*分数*.聚合参数必须是可排序的类型。
percentile_disc(分数 双精度[])组内(订购方式 任何元素) →任意数组

计算多个离散百分位数。结果是一个与*分数*参数,每个非空元素替换为对应于该百分位数的输入值。聚合参数必须是可排序的类型。

列出的每个“假设集”聚合表 9.60与定义的同名窗口函数相关联第 9.22 节.在每种情况下,聚合的结果都是关联的窗口函数将为从构造的“假设”行返回的值*参数,如果这样的行已添加到由排序参数.对于这些函数中的每一个,给出的直接参数列表参数必须与给出的聚合参数的数量和类型相匹配排序参数*。与大多数内置聚合不同,这些聚合并不严格,也就是说,它们不会删除包含空值的输入行。空值根据中指定的规则进行排序订购人条款

表9.60.假设集合聚合函数

作用

描述
部分模式
等级(阿格斯)组内(订购人 排序的参数) →比基特

计算假设行的秩,带间隙;即对等组中第一行的行号。
密秩(阿格斯)组内(订购人 排序的参数) →比基特

计算假设行的秩,没有间隙;该功能可以有效地统计同级组。
排名百分比 ( 阿格斯 ) 组内 ( 订购人 排序的参数 ) → 双精度

计算假设行的相对秩,即(等级-1)/(总行数-1)。因此,该值的范围为0到1(含0到1)。
库姆区 ( 阿格斯 ) 组内 ( 订购人 排序的参数 ) → 双精度

计算累积分布,即(假设行之前或对等行的行数)/(总行数)。因此,该值的范围为1/*N*1.

表9.61.分组操作

作用

描述
分组 ( 按表达式分组 ) → 整数

返回一个位掩码,指示分组表达式不包括在当前分组集中。位被分配与最低有效位对应的最右边的参数;如果生成当前结果行的分组集的分组条件中包含相应的表达式,则每一位为0,如果不包含,则每一位为1.

中显示的分组操作表9.61与分组集一起使用(请参见第7.2.4节)以区分结果行。争论的焦点分组函数没有实际求值,但它们必须与分组关联查询级别的子句。例如:

=> SELECT * FROM items_sold;
 make  | model | sales