⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
聚合函数

示例

生成一行,其中包含 amount 列的总和

SELECT sum(amount)
FROM sales;

为每个唯一区域生成一行,其中包含每个组的 amount 总和

SELECT region, sum(amount)
FROM sales
GROUP BY region;

仅返回 amount 总和高于 100 的区域

SELECT region
FROM sales
GROUP BY region
HAVING sum(amount) > 100;

返回 region 列中唯一值的数量

SELECT count(DISTINCT region)
FROM sales;

返回两个值:amount 的总和,以及区域为 northamount 减去列的总和(使用 FILTER 子句

SELECT sum(amount), sum(amount) FILTER (region != 'north')
FROM sales;

amount 列的顺序返回所有区域的列表

SELECT list(region ORDER BY amount DESC)
FROM sales;

使用 first() 聚合函数返回第一次销售的金额

SELECT first(amount ORDER BY date ASC)
FROM sales;

语法

聚合函数是将多行合并为单个值的函数。聚合函数与标量函数和窗口函数不同,因为它们会改变结果的基数。因此,聚合函数只能在 SQL 查询的 SELECTHAVING 子句中使用。

聚合函数中的 DISTINCT 子句

当提供 DISTINCT 子句时,只有唯一值才会被考虑进行聚合计算。这通常与 count 聚合函数结合使用以获取唯一元素的数量;但它也可以与系统中任何聚合函数一起使用。有些聚合函数对重复值不敏感(例如 minmax),对于这些函数,此子句会被解析但被忽略。

聚合函数中的 ORDER BY 子句

ORDER BY 子句可以在函数调用的最后一个参数之后提供。请注意,该子句前面没有逗号分隔符。

SELECT aggregate_function(arg, sep ORDER BY ordering_criteria);

此子句确保在应用函数之前对要聚合的值进行排序。大多数聚合函数对顺序不敏感,对于它们,此子句会被解析并丢弃。但是,有些顺序敏感的聚合函数在没有排序的情况下可能会产生非确定性结果,例如 firstlastliststring_agg / group_concat / listagg。通过对参数进行排序可以使这些函数变得确定性。

例如

CREATE TABLE tbl AS
    SELECT s FROM range(1, 4) r(s);

SELECT string_agg(s, ', ' ORDER BY s DESC) AS countdown
FROM tbl;
倒计时
3, 2, 1

处理 NULL

所有通用聚合函数都忽略 NULL 值,除了 list (array_agg)、first (arbitrary) 和 last。要从 list 中排除 NULL 值,可以使用 FILTER 子句。要从 first 中忽略 NULL 值,可以使用 any_value 聚合函数

count 外,所有通用聚合函数在空组上都返回 NULL。特别是,list 返回空列表,sum 返回零,string_agg 在这种情况下返回空字符串。

通用聚合函数

下表显示了可用的通用聚合函数。

函数 描述
any_value(arg) 返回 arg 中的第一个非空值。此函数受排序影响
arbitrary(arg) 返回 arg 中的第一个值(空或非空)。此函数受排序影响
arg_max(arg, val) 查找 val 最大的行,并计算该行上的 arg 表达式。忽略 argval 表达式的值为 NULL 的行。此函数受排序影响
arg_max(arg, val, n) arg_maxn 值泛化:返回一个 LIST,其中包含按 val 降序排列的前 n 行的 arg 表达式。此函数受排序影响
arg_max_null(arg, val) 查找 val 最大的行,并计算该行上的 arg 表达式。忽略 val 表达式评估为 NULL 的行。此函数受排序影响
arg_min(arg, val) 查找 val 最小的行,并计算该行上的 arg 表达式。忽略 argval 表达式的值为 NULL 的行。此函数受排序影响
arg_min(arg, val, n) 返回一个 LIST,其中包含按 val 升序排列的“底部” n 行的 arg 表达式。此函数受排序影响
arg_min_null(arg, val) 查找 val 最小的行,并计算该行上的 arg 表达式。忽略 val 表达式评估为 NULL 的行。此函数受排序影响
array_agg(arg) 返回一个包含列所有值的 LIST。此函数受排序影响
avg(arg) 计算 arg 中所有非空值的平均值。
bit_and(arg) 返回给定表达式中所有位的按位 AND 结果。
bit_or(arg) 返回给定表达式中所有位的按位 OR 结果。
bit_xor(arg) 返回给定表达式中所有位的按位 XOR 结果。
bitstring_agg(arg) 返回一个位字符串,其长度对应于非空(整数)值的范围,并在每个(不同)值的位置设置位。
bool_and(arg) 如果所有输入值都为 true,则返回 true,否则返回 false
bool_or(arg) 如果任何输入值为 true,则返回 true,否则返回 false
count() 返回组中的行数。
count(arg) 返回 arg 中非 NULL 值的数量。
countif(arg) 返回组中 argtrue 的行数。
favg(arg) 使用更精确的浮点求和(Kahan Sum)计算平均值。
first(arg) 返回 arg 中的第一个值(空或非空)。此函数受排序影响
fsum(arg) 使用更精确的浮点求和(Kahan Sum)计算总和。
geomean(arg) 计算 arg 中所有非空值的几何平均值。
histogram(arg) 返回一个由桶和计数组成的键值对 MAP
histogram(arg, boundaries) 返回一个键值对 MAP,表示提供的上限 boundaries 以及数据类型对应分区(左开右闭)中元素的计数。当出现大于所有给定 boundaries 的元素时,会自动添加一个数据类型最大值处的边界,请参见 is_histogram_other_bin。边界可以通过例如 equi_width_bins 提供。
histogram_exact(arg, elements) 返回一个键值对 MAP,表示请求的元素及其计数。当出现其他元素时,会自动添加一个数据类型特定的“包罗万象”元素来计数它们,请参见 is_histogram_other_bin
histogram_values(source, boundaries) 返回分区(bin)的上限及其计数。
kahan_sum(arg) 使用更精确的浮点求和(Kahan Sum)计算总和。
last(arg) 返回列的最后一个值。此函数受排序影响
list(arg) 返回一个包含列所有值的 LIST。此函数受排序影响
max(arg) 返回 arg 中存在的最大值。此函数不受去重影响
max(arg, n) 返回一个 LIST,其中包含按 arg 降序排列的“顶部” n 行的 arg 值。
max_by(arg, val) 查找 val 最大的行。计算该行上的 arg 表达式。此函数受排序影响
max_by(arg, val, n) 返回一个 LIST,其中包含按 val 降序排列的“顶部” n 行的 arg 表达式。
min(arg) 返回 arg 中存在的最小值。此函数不受去重影响
min(arg, n) 返回一个 LIST,其中包含按 arg 升序排列的“底部” n 行的 arg 值。
min_by(arg, val) 查找 val 最小的行。计算该行上的 arg 表达式。此函数受排序影响
min_by(arg, val, n) 返回一个 LIST,其中包含按 val 升序排列的“底部” n 行的 arg 表达式。
product(arg) 计算 arg 中所有非空值的乘积。
string_agg(arg) 使用逗号分隔符 (,) 连接列字符串值。此函数受排序影响
string_agg(arg, sep) 使用分隔符连接列字符串值。此函数受排序影响
sum(arg) 计算 arg 中所有非空值的总和 / 当 arg 为布尔值时,计算 true 值的数量。
sumkahan(arg) 使用更精确的浮点求和(Kahan Sum)计算总和。
weighted_avg(arg, weight) 计算 arg 中所有非空值的加权平均值,其中每个值都按其对应的 weight 进行缩放。如果 weightNULL,则跳过相应的 arg 值。

any_value(arg)

描述 返回 arg 中的第一个非 NULL 值。此函数受排序影响
示例 any_value(A)
别名 -

arbitrary(arg)

描述 返回 arg 中的第一个值(NULL 或非 NULL)。此函数受排序影响
示例 arbitrary(A)
别名 first(A)

arg_max(arg, val)

描述 查找 val 最大的行,并计算该行上的 arg 表达式。忽略 argval 表达式的值为 NULL 的行。此函数受排序影响
示例 arg_max(A, B)
别名 argmax(arg, val), max_by(arg, val)

arg_max(arg, val, n)

描述 arg_maxn 值泛化:返回一个 LIST,其中包含按 val 降序排列的前 n 行的 arg 表达式。此函数受排序影响
示例 arg_max(A, B, 2)
别名 argmax(arg, val, n), max_by(arg, val, n)

arg_max_null(arg, val)

描述 查找 val 最大的行,并计算该行上的 arg 表达式。忽略 val 表达式评估为 NULL 的行。此函数受排序影响
示例 arg_max_null(A, B)
别名 -

arg_min(arg, val)

描述 查找 val 最小的行,并计算该行上的 arg 表达式。忽略 argval 表达式的值为 NULL 的行。此函数受排序影响
示例 arg_min(A, B)
别名 argmin(arg, val), min_by(arg, val)

arg_min(arg, val, n)

描述 arg_minn 值泛化:返回一个 LIST,其中包含按 val 降序排列的前 n 行的 arg 表达式。此函数受排序影响
示例 arg_min(A, B, 2)
别名 argmin(arg, val, n), min_by(arg, val, n)

arg_min_null(arg, val)

描述 查找 val 最小的行,并计算该行上的 arg 表达式。忽略 val 表达式评估为 NULL 的行。此函数受排序影响
示例 arg_min_null(A, B)
别名 -

array_agg(arg)

描述 返回一个包含列所有值的 LIST。此函数受排序影响
示例 array_agg(A)
别名 list

avg(arg)

描述 计算 arg 中所有非空值的平均值。
示例 avg(A)
别名 mean

bit_and(arg)

描述 返回给定表达式中所有位的按位 AND 结果。
示例 bit_and(A)
别名 -

bit_or(arg)

描述 返回给定表达式中所有位的按位 OR 结果。
示例 bit_or(A)
别名 -

bit_xor(arg)

描述 返回给定表达式中所有位的按位 XOR 结果。
示例 bit_xor(A)
别名 -

bitstring_agg(arg)

描述 返回一个位字符串,其长度对应于非空(整数)值的范围,并在每个(不同)值的位置设置位。
示例 bitstring_agg(A)
别名 -

bool_and(arg)

描述 如果所有输入值都为 true,则返回 true,否则返回 false
示例 bool_and(A)
别名 -

bool_or(arg)

描述 如果任何输入值为 true,则返回 true,否则返回 false
示例 bool_or(A)
别名 -

count()

描述 返回组中的行数。
示例 count()
别名 count(*)

count(arg)

描述 返回 arg 中非 NULL 值的数量。
示例 count(A)
别名 -

countif(arg)

描述 返回组中 argtrue 的行数。
示例 countif(A)
别名 -

favg(arg)

描述 使用更精确的浮点求和(Kahan Sum)计算平均值。
示例 favg(A)
别名 -

first(arg)

描述 返回 arg 中的第一个值(空或非空)。此函数受排序影响
示例 first(A)
别名 arbitrary(A)

fsum(arg)

描述 使用更精确的浮点求和(Kahan Sum)计算总和。
示例 fsum(A)
别名 sumkahan, kahan_sum

geomean(arg)

描述 计算 arg 中所有非空值的几何平均值。
示例 geomean(A)
别名 geometric_mean(A)

histogram(arg)

描述 返回一个由桶和计数组成的键值对 MAP
示例 histogram(A)
别名 -

histogram(arg, boundaries)

描述 返回一个键值对 MAP,表示提供的上限 boundaries 以及数据类型对应分区(左开右闭)中元素的计数。当出现大于所有给定 boundaries 的元素时,会自动添加一个数据类型最大值处的边界,请参见 is_histogram_other_bin。边界可以通过例如 equi_width_bins 提供。
示例 histogram(A, [0, 1, 10])
别名 -

histogram_exact(arg, elements)

描述 返回一个键值对 MAP,表示请求的元素及其计数。当出现其他元素时,会自动添加一个数据类型特定的“包罗万象”元素来计数它们,请参见 is_histogram_other_bin
示例 histogram_exact(A, [0, 1, 10])
别名 -

histogram_values(source, col_name, technique, bin_count)

描述 返回分区(bin)的上限及其计数。
示例 histogram_values(integers, i, bin_count := 2)
别名 -

last(arg)

描述 返回列的最后一个值。此函数受排序影响
示例 last(A)
别名 -

list(arg)

描述 返回一个包含列所有值的 LIST。此函数受排序影响
示例 list(A)
别名 array_agg

max(arg)

描述 返回 arg 中存在的最大值。此函数不受去重影响
示例 max(A)
别名 -

max(arg, n)

描述 返回一个 LIST,其中包含按 arg 降序排列的“顶部” n 行的 arg 值。
示例 max(A, 2)
别名 -

max_by(arg, val)

描述 查找 val 最大的行。计算该行上的 arg 表达式。此函数受排序影响
示例 max_by(A, B)
别名 argmax(arg, val), arg_max(arg, val)

max_by(arg, val, n)

描述 返回一个 LIST,其中包含按 val 降序排列的“顶部” n 行的 arg 表达式。
示例 max_by(A, B, 2)
别名 argmax(arg, val, n), arg_max(arg, val, n)

min(arg)

描述 返回 arg 中存在的最小值。此函数不受去重影响
示例 min(A)
别名 -

min(arg, n)

描述 返回一个 LIST,其中包含按 arg 升序排列的“底部” n 行的 arg 值。
示例 min(A, 2)
别名 -

min_by(arg, val)

描述 查找 val 最小的行。计算该行上的 arg 表达式。此函数受排序影响
示例 min_by(A, B)
别名 argMin(arg, val), arg_min(arg, val)

min_by(arg, val, n)

描述 返回一个 LIST,其中包含按 val 升序排列的“底部” n 行的 arg 表达式。
示例 min_by(A, B, 2)
别名 argMin(arg, val, n), arg_min(arg, val, n)

product(arg)

描述 计算 arg 中所有非空值的乘积。
示例 product(A)
别名 -

string_agg(arg)

描述 使用逗号分隔符 (,) 连接列字符串值。此函数受排序影响
示例 string_agg(S, ',')
别名 group_concat(arg, sep), listagg(arg, sep)

string_agg(arg, sep)

描述 使用分隔符连接列字符串值。此函数受排序影响
示例 string_agg(S, ',')
别名 group_concat(arg, sep), listagg(arg, sep)

sum(arg)

描述 计算 arg 中所有非空值的总和 / 当 arg 为布尔值时,计算 true 值的数量。
示例 sum(A)
别名 -

weighted_avg(arg, weight)

描述 计算 arg 中所有非空值的加权平均值,其中每个值都按其对应的 weight 进行缩放。如果 weightNULL,则该值将被跳过。
示例 weighted_avg(A, W)
别名 wavg(arg, weight)

近似聚合函数

下表显示了可用的近似聚合函数。

函数 描述 示例
approx_count_distinct(x) 使用 HyperLogLog 计算唯一元素的近似计数。 approx_count_distinct(A)
approx_quantile(x, pos) 使用 T-Digest 计算近似分位数。 approx_quantile(A, 0.5)
approx_top_k(arg, k) 使用 Filtered Space-Saving 计算一个 LIST,其中包含 argk 个近似最频繁值。  
reservoir_quantile(x, quantile, sample_size = 8192) 使用水塘抽样(reservoir sampling)计算近似分位数,样本大小是可选的,默认大小为 8192。 reservoir_quantile(A, 0.5, 1024)

统计聚合函数

下表显示了可用的统计聚合函数。它们都忽略 NULL 值(对于单个输入列 x 的情况),或者忽略任一输入为 NULL 的对(对于两个输入列 yx 的情况)。

函数 描述
corr(y, x) 相关系数。
covar_pop(y, x) 总体协方差,不包含偏差校正。
covar_samp(y, x) 样本协方差,包含 Bessel 偏差校正。
entropy(x) 对数-2 熵。
kurtosis_pop(x) (Fisher 定义的)超额峰度,不包含偏差校正。
kurtosis(x) (Fisher 定义的)超额峰度,根据样本大小进行偏差校正。
mad(x) 中位数绝对偏差。时间类型返回一个正的 INTERVAL
median(x) 数据集的中间值。对于偶数个值,定量值取平均值,序数值返回较低值。
mode(x) 最频繁出现的值。此函数受排序影响
quantile_cont(x, pos) 0 <= pos <= 1 的范围内,x 的插值 pos-分位数。返回 x 的第 pos * (n_nonnull_values - 1) 个值(零索引,按指定顺序),如果索引不是整数,则返回相邻值之间的插值。直观地说,它将 x 的值作为线上等间距的排列,从 0 开始到 1 结束,并返回 pos 处(插值)的值。如果 posLISTFLOATs,则结果是相应插值分位数的 LIST
quantile_disc(x, pos) 0 <= pos <= 1 的范围内,x 的离散 pos-分位数。返回 x 的第 greatest(ceil(pos * n_nonnull_values) - 1, 0) 个值(零索引,按指定顺序)。直观地说,它将 x 的每个值分配到区间 [0, 1] 的一个等大小的子区间(除初始区间外左开右闭),并选择包含 pos 的子区间的值。如果 posLISTFLOATs,则结果是相应离散分位数的 LIST
regr_avgx(y, x) NULL 对的自变量平均值,其中 x 是自变量,y 是因变量。
regr_avgy(y, x) NULL 对的因变量平均值,其中 x 是自变量,y 是因变量。
regr_count(y, x) NULL 对的数量。
regr_intercept(y, x) 单变量线性回归线的截距,其中 x 是自变量,y 是因变量。
regr_r2(y, x) y 和 x 之间皮尔逊相关系数的平方。又称:线性回归中的决定系数,其中 x 是自变量,y 是因变量。
regr_slope(y, x) 线性回归线的斜率,其中 x 是自变量,y 是因变量。
regr_sxx(y, x) NULL 对的自变量总体方差,包含 Bessel 偏差校正,其中 x 是自变量,y 是因变量。
regr_sxy(y, x) 总体协方差,包含 Bessel 偏差校正。
regr_syy(y, x) NULL 对的因变量总体方差,包含 Bessel 偏差校正,其中 x 是自变量,y 是因变量。
skewness(x) 偏度。
sem(x) 均值标准误差。
stddev_pop(x) 总体标准差。
stddev_samp(x) 样本标准差。
var_pop(x) 总体方差,不包含偏差校正。
var_samp(x) 样本方差,包含 Bessel 偏差校正。

corr(y, x)

描述 相关系数。
公式 covar_pop(y, x) / (stddev_pop(x) * stddev_pop(y))
别名 -

covar_pop(y, x)

描述 总体协方差,不包含偏差校正。
公式 (sum(x*y) - sum(x) * sum(y) / regr_count(y, x)) / regr_count(y, x), covar_samp(y, x) * (1 - 1 / regr_count(y, x))
别名 -

covar_samp(y, x)

描述 样本协方差,包含 Bessel 偏差校正。
公式 (sum(x*y) - sum(x) * sum(y) / regr_count(y, x)) / (regr_count(y, x) - 1), covar_pop(y, x) / (1 - 1 / regr_count(y, x))
别名 regr_sxy(y, x)

entropy(x)

描述 对数-2 熵。
公式 -
别名 -

kurtosis_pop(x)

描述 (Fisher 定义的)超额峰度,不包含偏差校正。
公式 -
别名 -

kurtosis(x)

描述 (Fisher 定义的)超额峰度,根据样本大小进行偏差校正。
公式 -
别名 -

mad(x)

描述 中位数绝对偏差。时间类型返回一个正的 INTERVAL
公式 median(abs(x - median(x)))
别名 -

median(x)

描述 数据集的中间值。对于偶数个值,定量值取平均值,序数值返回较低值。
公式 quantile_cont(x, 0.5)
别名 -

mode(x)

描述 最频繁出现的值。此函数受排序影响
公式 -
别名 -

quantile_cont(x, pos)

描述 0 <= pos <= 1 的范围内,x 的插值 pos-分位数。返回 x 的第 pos * (n_nonnull_values - 1) 个值(零索引,按指定顺序),如果索引不是整数,则返回相邻值之间的插值。直观地说,它将 x 的值作为线上等间距的排列,从 0 开始到 1 结束,并返回 pos 处(插值)的值。如果 posLISTFLOATs,则结果是相应插值分位数的 LIST
公式 -
别名 -

quantile_disc(x, pos)

描述 0 <= pos <= 1 的范围内,x 的离散 pos-分位数。返回 x 的第 greatest(ceil(pos * n_nonnull_values) - 1, 0) 个值(零索引,按指定顺序)。直观地说,它将 x 的每个值分配到区间 [0, 1] 的一个等大小的子区间(除初始区间外左开右闭),并选择包含 pos 的子区间的值。如果 posLISTFLOATs,则结果是相应离散分位数的 LIST
公式 -
别名 分位数

regr_avgx(y, x)

描述 NULL 对的自变量平均值,其中 x 是自变量,y 是因变量。
公式 -
别名 -

regr_avgy(y, x)

描述 NULL 对的因变量平均值,其中 x 是自变量,y 是因变量。
公式 -
别名 -

regr_count(y, x)

描述 NULL 对的数量。
公式 -
别名 -

regr_intercept(y, x)

描述 单变量线性回归线的截距,其中 x 是自变量,y 是因变量。
公式 regr_avgy(y, x) - regr_slope(y, x) * regr_avgx(y, x)
别名 -

regr_r2(y, x)

描述 y 和 x 之间皮尔逊相关系数的平方。又称:线性回归中的决定系数,其中 x 是自变量,y 是因变量。
公式 -
别名 -

regr_slope(y, x)

描述 返回线性回归线的斜率,其中 x 是自变量,y 是因变量。
公式 regr_sxy(y, x) / regr_sxx(y, x)
别名 -

regr_sxx(y, x)

描述 NULL 对的自变量总体方差,包含 Bessel 偏差校正,其中 x 是自变量,y 是因变量。
公式 -
别名 -

regr_sxy(y, x)

描述 总体协方差,包含 Bessel 偏差校正。
公式 -
别名 -

regr_syy(y, x)

描述 NULL 对的因变量总体方差,包含 Bessel 偏差校正,其中 x 是自变量,y 是因变量。
公式 -
别名 -

sem(x)

描述 均值标准误差。
公式 -
别名 -

skewness(x)

描述 偏度。
公式 -
别名 -

stddev_pop(x)

描述 总体标准差。
公式 sqrt(var_pop(x))
别名 -

stddev_samp(x)

描述 样本标准差。
公式 sqrt(var_samp(x))
别名 stddev(x)

var_pop(x)

描述 总体方差,不包含偏差校正。
公式 (sum(x^2) - sum(x)^2 / count(x)) / count(x), var_samp(y, x) * (1 - 1 / count(x))
别名 -

var_samp(x)

描述 样本方差,包含 Bessel 偏差校正。
公式 (sum(x^2) - sum(x)^2 / count(x)) / (count(x) - 1), var_pop(y, x) / (1 - 1 / count(x))
别名 variance(arg, val)

有序集聚合函数

下表显示了可用的“有序集”聚合函数。这些函数使用 WITHIN GROUP (ORDER BY sort_expression) 语法指定,并被转换为等效的聚合函数,该函数将排序表达式作为第一个参数。

函数 等效于
mode() WITHIN GROUP (ORDER BY column [(ASC|DESC)]) mode(column ORDER BY column [(ASC|DESC)])
percentile_cont(fraction) WITHIN GROUP (ORDER BY column [(ASC|DESC)]) quantile_cont(column, fraction ORDER BY column [(ASC|DESC)])
percentile_cont(fractions) WITHIN GROUP (ORDER BY column [(ASC|DESC)]) quantile_cont(column, fractions ORDER BY column [(ASC|DESC)])
percentile_disc(fraction) WITHIN GROUP (ORDER BY column [(ASC|DESC)]) quantile_disc(column, fraction ORDER BY column [(ASC|DESC)])
percentile_disc(fractions) WITHIN GROUP (ORDER BY column [(ASC|DESC)]) quantile_disc(column, fractions ORDER BY column [(ASC|DESC)])

杂项聚合函数

函数 描述 别名
grouping() 对于包含 GROUP BY 以及 ROLLUPGROUPING SETS 的查询:返回一个整数,用于标识哪些参数表达式用于分组以创建当前的总聚合行。 grouping_id()