聚合函数
聚合函数可根据一组输入值计算出一个结果。
有关聚合表达式支持句法的详细信息,请参阅聚合表达式。
通用聚合函数
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
有序集合聚合函数
目前,有序集合聚合函数仅支持常量分数参数。
mode
计算 mode,即聚合参数中出现次数最多的值。如果有多个值以相同的次数出现,则任意选择第一个值。
mode () WITHIN GROUP ( ORDER BY sort_expression anyelement ) -> same as sort_expression
sort_expression
:必须是可排序类型。
此示例可计算 table1
中 column1
数值的 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 之间。
此示例可计算 table1
中 column1
数值的中位数(第 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
:必须是可排序类型。
此示例可计算 table1
中 column1
数值的第 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