聚集函数#

聚集函数 从一个输入值的集合计算出一个单一值。内建的通用聚集函数在表 通用聚集函数中列出,而统计性聚集在表 用于统计的聚集函数中列出。内建的组内有序集聚集函数在表 有序集聚集函数中列出,而内建的组内假想集聚集在表 假想集聚集函数中列出。与聚集函数紧密相关的分组操作在表 分组操作函数中列出。

通用聚集函数#

函数

参数类型

返回类型

部分模式

描述

array_agg (expression)

任何非数组类型

参数类型的数组

No

输入值(包括空)被连接到一个数组行和数组比较

array_agg (expression)

任意数组类型

和参数数据类型相同

No

输入数组被串接到一个更高维度的数组中(输入必须都具有相同的维度并且不能为空或者NULL)

avg (expression)

smallint, int, bigint, real, double precision, numericinterval

对于任何整数类型参数是 numeric ,对于一个浮点参数是 double precision ,否则和参数数据类型相同

Yes

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

bit_and (expression)

smallint, int, bigint, 或 bit

与参数数据类型相同

Yes

所有非空输入值的按位与,如果没有非空值则结果是空值

bit_or (expression)

smallint, int, bigint, 或 bit

与参数数据类型相同

Yes

所有非空输入值的按位或,如果没有非空值则结果是空值

bool_and (expression)

bool

bool

Yes

如果所有输入值为真则结果为真,否则为假

bool_or (expression)

bool

bool

Yes

至少一个输入值为真时结果为真,否则为假

count(*)

-

bigint

Yes

输入的行数

count (expression)

any

bigint

Yes

expression 值非空的输入行的数目

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 对象,值可以为空,但不能是名字。

jsonb_object_agg (name, value)

(any, any)

jsonb

No

把名字/值对聚合成一个 JSON 对象,值可以为空,但不能是名字。

max(expression)

任意数组、数字、串、日期/时间、网络或者枚举类型,或者这些类型的数组

与参数数据类型相同

Yes

所有非空输入值中 expression 的最大值

min(expression)

任意数组、数字、串、日期/时间、网络或者枚举类型,或者这些类型的数组

与参数数据类型相同

Yes

所有非空输入值中 expression 的最小值

string_agg (expression, delimiter)

(text, text)(bytea, bytea)

与参数数据类型相同

No

非空输入值连接成一个串,用定界符分隔

sum (expression)

smallint, int, bigint, real, double precision, numeric, intervalmoney

smallintint 参数是 bigint ,对 bigint 参数是 numeric ,否则和参数数据类型相同

Yes

所有非空输入值的 expression 的和

xmlagg (expression)

xml

xml

No

连接非空XML值

请注意,除了count以外,这些函数在没有行被选中时返回控制。尤其是sum函数在没有输入行时返回空值,而不是零,并且array_agg在这种情况返回空值而不是一个空数组。必要时可以用coalesce把空值替换成零或一个空数组。

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

备注

注意

布尔聚集bool_andbool_or对应于标准的 SQL 聚集everyanysome。而对于anysome,似乎在标准语法中有一个歧义:

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

如果子查询返回一行有一个布尔值的结果,这里的ANY可以被认为是引入一个子查询,或者是作为一个聚集函数。因而标准的名称不能指定给这些聚集。

备注

注意

在把count聚集应用到整个表上时,习惯于使用其他 SQL 数据管理系统的用户可能会对它的性能感到失望。一个如下的查询:

SELECT count(*) FROM sometable;

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

与相似的用户定义的聚集函数一样,聚集函数array_aggjson_aggjsonb_aggjson_object_aggjsonb_object_aggstring_aggxmlagg会依赖输入值的顺序产生有意义的不同结果值。这个顺序默认是不用指定的,但是可以在聚集调用时使用ORDER BY子句进行控制。作为一种选择,从一个排序号的子查询来提供输入值通常会有帮助。例如:

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

注意如果外面的查询层次包含额外的处理(例如连接),这种方法可能会失败,因为这可能导致子查询的输出在计算聚集之前被重新排序。

表 用于统计的聚集函数展示了通常被用在统计分析中的聚集函数(这些被隔离出来是为了不和常用聚集混淆)。其中描述提到了N,它表示对应于所有非空输入表达式的输入行的数目。在所有情况中,如果计算是无意义的,将会返回空值,例如当N为零。

表 有序集聚集函数展示了一些使用有序集聚集语法的聚集函数。这些函数有时也被称为 “逆分布”函数。

有序集聚集函数#

函数

直接参数类型

聚集参数类型

返回类型

部分模式

描述

mode() WITHIN GROUP (ORDER BY sort_expression)

任何可排序类型

与排序表达式相同

No

返回最频繁的输入值(如果有多个频度相同的值就选第一个)

percentile_cont (fraction) WITHIN GROUP (ORDER BY sort_expression)

double precision

double precision 或者 interval

与排序表达式相同

No

连续百分率:返回一个对应于排序中指定分数的值,如果有必要就在相邻的输入项之间插值

percentile_cont (fractions) WITHIN GROUP (ORDER BY sort_expression)

double precision[]

double precision 或者 interval

排序表达式的类型的数组

No

多重连续百分率:返回一个匹配 fractions 参数形状的结果数组,其中每一个非空元素都用对应于那个百分率的值替换

percentile_disc (fraction) WITHIN GROUP (ORDER BY sort_expression)

double precision

一种可排序类型

与排序表达式相同

No

离散百分率:返回第一个在排序中位置等于或者超过指定分数的输入值

percentile_disc (fractions) WITHIN GROUP (ORDER BY sort_expression)

double precision[]

任何可排序类型

排序表达式的类型的数组

No

多重离散百分率:返回一个匹配 fractions 参数形状的结果数组,其中每一个非空元素都用对应于那个百分率的输入值替换

所有列在表 有序集聚集函数中的聚集会忽略它们的已 排序输入中的空值。对那些有一个fraction参数的聚 集来说,该分数值必须位于 0 和 1 之间,否则会抛出错误。不过,一个空分数值会 产生一个空结果。

每个列在表 假想集聚集函数中的聚集都与一个定义在 窗口函数中的同名窗口函数相关联。在每种情况中,聚集 结果的计算方法是:假设根据args构建的“假想”行已 经被增加到从sorted_args计算得到的已排序行分组中, 然后用相关联的窗口函数针对该行返回的值就是聚集的结果。

假想集聚集函数#

函数

直接参数类型

聚集参数类型

返回类型

部分模式

描述

rank(args) WITHIN GROUP (ORDER BY sorted_args)

VARIADIC any

VARIADIC any

bigint

No

假想行的排名,为重复的行留下间隔

dense_rank (args) WITHIN GROUP (ORDER BY sorted_args)

VARIADIC any

VARIADIC any

bigint

No

假想行的排名,不留间隔

percent_rank (args) WITHIN GROUP (ORDER BY sorted_args)

VARIADIC any

VARIADIC any

double precision

No

假想行的相对排名,范围从 0 到 1

cume_dist (args) WITHIN GROUP (ORDER BY sorted_args)

VARIADIC any

VARIADIC any

double precision

No

假想行的相对排名,范围从 1 / N 到 1

对于这些假想集聚集的每一个,args中给定的直接参数 列表必须匹配sorted_args中给定的聚集参数的 数量和类型。与大部分的内建聚集不同,这些聚集并不严格,即它们不会丢弃包含空值 的输入行。空值的排序根据ORDER BY子句中指定的规则进行。

分组操作函数#

函数

返回类型

描述

GROUPING(args...)

integer

整数位掩码指示哪些参数不被包括在当前分组集合中

分组操作用来与分组集合共同来 区分结果行。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)