Skip to main content

聚合函数

聚合函数可根据一组输入值计算出一个结果。

有关聚合表达式支持句法的详细信息,请参阅聚合表达式

通用聚合函数

array_agg

从输入值返回一个数组,输入的的每个值都赋值给一个数组元素。ORDER BY 子句是可选的,指定了聚合中处理行的顺序,这决定了结果数组中元素的顺序。

句法
array_agg ( expression [ ORDER BY [ sort_expression { ASC | DESC } ] ] ) -> output_array       

avg

返回所选值的平均值(算术平均值)。

句法
avg ( expression ) -> see description   

输入类型包括 smallint、int、bigint、numeric、real 和 double precision。

整数输入的返回类型为 numeric,浮点输入的返回类型为 double precision。


bit_and

返回所有非空输入值的按位 AND,如果未提供非空值,则返回 null。

句法
bit_and ( smallint, int, or bigint ) -> same as input type

bit_or

返回所有非空输入值的按位 OR,如果未提供非空值,则返回 null。

句法
bit_or ( smallint, int, or bigint ) -> same as input type

bool_and

如果所有输入值都为 true,则返回 true,否则返回 false。

句法
bool_and ( boolean ) -> boolean

bool_or

如果至少有一个输入值为 true,则返回 true,否则返回 false。

句法
bool_or ( boolean ) -> boolean

count

返回非空行的数量。

句法
count ( expression ) -> bigint    

输入可以是任何支持的数据类型。


jsonb_agg

将值(包括空值)聚合为 JSON 数组。ORDER BY 子句是可选的,指定了聚合中处理行的顺序,这决定了结果数组中元素的顺序。

句法
jsonb_agg ( any_element ) -> jsonb    

jsonb_object_agg

将名称/值对聚合为 JSON 对象。

句法
jsonb_object_agg ( key "string" , value "any" ) -> jsonb   

max

返回一组值中的最大值。

句法
max ( expression ) -> same as input type    

输入可以是任何数字、字符串、日期/时间或间隔类型,也可以是这些类型的数组。


min

返回一组值中的最小值。

句法
min ( expression ) -> same as input type  

输入可以是任何数字、字符串、日期/时间或间隔类型,也可以是这些类型的数组。


string_agg

将非空值合并为一个字符串,用 delimiter_string 分隔。ORDER BY 子句是可选的,指定了聚合中处理行的顺序,这决定了结果数组中元素的顺序。

句法
string_agg ( expression, delimiter_string ) -> output_string  

sum

返回所有输入值的总和。

句法
sum ( expression )  

输入类型包括 smallint、int、bigint、numeric、real 和 double precision。

如果输入的是 smallint 或 int,则返回类型为 bigint。如果输入的是 bigint,则返回类型为 numeric。否则返回类型与输入数据类型相同。

统计学聚合函数

stddev_pop

计算输入值的总体标准差。如果输入不包含非空值,则返回 NULL

句法
stddev_pop ( expression ) -> output_value

stddev_samp

计算输入值的样本标准差。如果输入包含的非空值少于两个,则返回 NULL

句法
stddev_samp ( expression ) -> output_value

var_pop

计算输入值的总体方差。如果输入不包含非空值,则返回 NULL

句法
var_pop ( expression ) -> output_value

var_samp

计算输入值的样本方差。如果输入包含的非空值少于两个,则返回 NULL

句法
var_samp ( expression ) -> output_value

有序集合聚合函数

note

目前,有序集合聚合函数仅支持常量分数参数。

mode

计算 mode,即聚合参数中出现次数最多的值。如果有多个值以相同的次数出现,则任意选择第一个值。

句法
mode () WITHIN GROUP ( ORDER BY sort_expression anyelement ) -> same as sort_expression

sort_expression:必须是可排序类型。

此示例可计算 table1column1 数值的 mode。

示例
SELECT mode() WITHIN GROUP (ORDER BY column1) FROM table1;

percentile_cont

计算连续百分位数,即在有序聚合参数值集合中的指定分数。如果需要,可以在相邻的输入项之间进行插值。

句法
percentile_cont ( fraction double precision ) WITHIN GROUP ( ORDER BY sort_expression double precision ) -> double precision

fraction:表示所需百分位数的分数值,应该介于 0 和 1 之间。

此示例可计算 table1column1 数值的中位数(第 50 百分位数)。

示例
SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY column1) FROM table1;

如果提供 NULL,函数将不计算特定百分位数,而是返回 NULL。


percentile_disc

计算离散百分位数,即在有序聚合参数值集合中,排序位置大于等于指定分数的第一个值。

句法
percentile_disc ( fraction double precision ) WITHIN GROUP ( ORDER BY sort_expression anyelement ) -> same as sort_expression

fraction:表示所需百分位数的分数值,应该介于 0 和 1 之间。

sort_expression:必须是可排序类型。

此示例可计算 table1column1 数值的第 75 百分位数。

示例
SELECT percentile_disc(0.75) WITHIN GROUP (ORDER BY column1) FROM table1;

如果提供 NULL,函数将不计算特定百分位数,而是返回 NULL。

分组操作函数

分组操作函数与分组集一起,用于区分结果行。grouping() 函数的参数不会被实际计算,但必须与关联查询级别的 GROUP BY 子句中的表达式完全匹配。

grouping

返回一个位掩码,表明哪些 GROUP BY 表达式未包含在当前分组集中。位被赋值为最右侧参数(最低有效位)。如果相应表达式包含在生成当前结果行的分组集的分组条件中,则位为 0;如果不包含,则为 1。

句法
grouping ( group_by_expression(s) )integer

示例

创建表
CREATE TABLE items_sold (brand varchar, size varchar, sales int);
插入数据
INSERT INTO items_sold VALUES ('Foo', 'L', 10),('Foo', 'M', 20),('Bar', 'M', 15),('Bar', 'L', '5');
获取分组结果
SELECT brand, size, sum(sales), grouping(brand), grouping(size), grouping(brand,size), count(DISTINCT sales) 
FROM items_sold
GROUP BY GROUPING SETS ((brand), (size), ());
------返回结果
Bar NULL 20 0 1 1 2
Foo NULL 30 0 1 1 2
NULL L 15 1 0 2 2
NULL M 35 1 0 2 2
NULL NULL 50 1 1 3 4