聚合函数
本页是聚合函数参考。聚合函数把一组行归并为单个值。时序场景常用的 selector 聚合函数(selector_first / selector_last / selector_min / selector_max)见 Selector 函数。大多数聚合函数都可以加 OVER (...) 作为窗口函数使用,个别函数(如 grouping)例外。
| 函数 | 别名 | 说明 |
|---|---|---|
array_agg |
— | 将表达式元素聚合为数组 |
avg |
mean |
数值平均值 |
bit_and |
— | 非 null 值的按位 AND |
bit_or |
— | 非 null 值的按位 OR |
bit_xor |
— | 非 null 值的按位 XOR |
bool_and |
— | 所有非 null 值均为 true 时返回 true |
bool_or |
— | 任一非 null 值为 true 时返回 true |
count |
— | 非 null 值数量 |
first_value |
— | 分组内按排序的第一个元素 |
grouping |
— | 该列在当前行被上卷汇总(未参与该行分组)时返回 1,参与分组时返回 0 |
last_value |
— | 分组内按排序的最后一个元素 |
nth_value |
— | 一组值中的第 n 个值 |
max |
— | 最大值 |
median |
— | 中位数 |
min |
— | 最小值 |
string_agg |
— | 以分隔符连接字符串值 |
sum |
— | 求和 |
var |
var_sample、var_samp |
统计样本方差 |
var_pop |
var_population |
统计总体方差 |
corr |
— | 两个数值之间的相关系数 |
covar_pop |
— | 数对的总体协方差 |
covar_samp |
covar |
数对的样本协方差 |
regr_avgx |
— | 自变量的平均值 |
regr_avgy |
— | 因变量的平均值 |
regr_count |
— | 非 null 成对数据点数量 |
regr_intercept |
— | 线性回归线的 y 轴截距 |
regr_r2 |
— | 相关系数的平方 |
regr_slope |
— | 线性回归线的斜率 |
regr_sxx |
— | 自变量的平方和 |
regr_sxy |
— | 成对数据点的乘积和 |
regr_syy |
— | 因变量的平方和 |
stddev |
stddev_samp |
标准差 |
stddev_pop |
— | 总体标准差 |
approx_distinct |
— | 近似去重计数(HyperLogLog 算法) |
approx_median |
— | 近似中位数(第 50 百分位数) |
approx_percentile_cont |
— | 近似百分位数(t-digest 算法) |
approx_percentile_cont_with_weight |
— | 加权近似百分位数(t-digest 算法) |
通用聚合
array_agg
返回由 expression 元素构成的数组。如果要求排序,元素按指定顺序插入。
语法:array_agg(expression [ORDER BY expression])
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT array_agg(column_name ORDER BY other_column) FROM table_name;
2+----------------------------------------------+
3| array_agg(column_name ORDER BY other_column) |
4+----------------------------------------------+
5| [element1, element2, element3] |
6+----------------------------------------------+
avg
返回指定列中数值的平均值。
语法:avg(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
别名:mean
示例:
1> SELECT avg(column_name) FROM table_name;
2+------------------+
3| avg(column_name) |
4+------------------+
5| 42.75 |
6+------------------+
bit_and
计算所有非 null 输入值的按位 AND。
语法:bit_and(expression)
参数:
expression:要操作的整数表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT bit_and(x) FROM (VALUES (7), (12), (14)) AS t(x);
2+--------------+
3| bit_and(t.x) |
4+--------------+
5| 4 |
6+--------------+
bit_or
计算所有非 null 输入值的按位 OR。
语法:bit_or(expression)
参数:
expression:要操作的整数表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT bit_or(x) FROM (VALUES (1), (2), (4)) AS t(x);
2+-------------+
3| bit_or(t.x) |
4+-------------+
5| 7 |
6+-------------+
bit_xor
计算所有非 null 输入值的按位异或(XOR)。
语法:bit_xor(expression)
参数:
expression:要操作的整数表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT bit_xor(x) FROM (VALUES (5), (3)) AS t(x);
2+--------------+
3| bit_xor(t.x) |
4+--------------+
5| 6 |
6+--------------+
bool_and
如果所有非 null 输入值都为 true 则返回 true,否则返回 false。
语法:bool_and(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT bool_and(x) FROM (VALUES (true), (false), (true)) AS t(x);
2+---------------+
3| bool_and(t.x) |
4+---------------+
5| false |
6+---------------+
bool_or
只要有任一非 null 输入值为 true 就返回 true,否则返回 false。
语法:bool_or(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT bool_or(x) FROM (VALUES (true), (false), (true)) AS t(x);
2+--------------+
3| bool_or(t.x) |
4+--------------+
5| true |
6+--------------+
count
返回指定列中非 null 值的数量。若要将 null 值也计入总数,使用 count(*)。
语法:count(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT count(column_name) FROM table_name;
2+--------------------+
3| count(column_name) |
4+--------------------+
5| 100 |
6+--------------------+
7
8> SELECT count(*) FROM table_name;
9+----------+
10| count(*) |
11+----------+
12| 120 |
13+----------+
first_value
按照要求的排序返回聚合分组中的第一个元素。如果未指定排序,返回分组中的任意元素。
语法:first_value(expression [ORDER BY expression])
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT first_value(column_name ORDER BY other_column) FROM table_name;
2+------------------------------------------------+
3| first_value(column_name ORDER BY other_column) |
4+------------------------------------------------+
5| first_element |
6+------------------------------------------------+
grouping
当指定列在当前行所属的分组集中被上卷汇总(即未参与该行的分组)时返回 1;当该列参与了该行的分组时返回 0。常与 GROUPING SETS、ROLLUP、CUBE 搭配,用于区分小计与合计行。
语法:grouping(expression)
参数:
expression:要判断其是否参与当前行分组的列或表达式。
示例:
1> SELECT x, GROUPING(x) AS grouping_flag
2 FROM (VALUES (1), (2)) AS t(x)
3 GROUP BY GROUPING SETS ((x), ())
4 ORDER BY x;
5+---+---------------+
6| x | grouping_flag |
7+---+---------------+
8| 1 | 0 |
9| 2 | 0 |
10| | 1 |
11+---+---------------+
last_value
按照要求的排序返回聚合分组中的最后一个元素。如果未指定排序,返回分组中的任意元素。
语法:last_value(expression [ORDER BY expression])
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT last_value(column_name ORDER BY other_column) FROM table_name;
2+-----------------------------------------------+
3| last_value(column_name ORDER BY other_column) |
4+-----------------------------------------------+
5| last_element |
6+-----------------------------------------------+
nth_value
返回一组值中的第 n 个值。
语法:nth_value(expression, n ORDER BY expression)
参数:
expression:要从中获取第 n 个值的列或表达式。n:要获取的值的位置(第 n 个),基于排序确定。
示例:
1> SELECT dept_id, salary, NTH_VALUE(salary, 2) OVER (PARTITION BY dept_id ORDER BY salary ASC) AS second_salary_by_dept
2 FROM (VALUES (1,30000), (1,40000), (1,50000), (2,35000), (2,45000)) AS t(dept_id, salary);
3+---------+--------+-----------------------+
4| dept_id | salary | second_salary_by_dept |
5+---------+--------+-----------------------+
6| 1 | 30000 | |
7| 1 | 40000 | 40000 |
8| 1 | 50000 | 40000 |
9| 2 | 35000 | |
10| 2 | 45000 | 45000 |
11+---------+--------+-----------------------+
max
返回指定列中的最大值。
语法:max(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT max(column_name) FROM table_name;
2+------------------+
3| max(column_name) |
4+------------------+
5| 150 |
6+------------------+
median
返回指定列中的中位数。
语法:median(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT median(column_name) FROM table_name;
2+---------------------+
3| median(column_name) |
4+---------------------+
5| 45.5 |
6+---------------------+
min
返回指定列中的最小值。
语法:min(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT min(column_name) FROM table_name;
2+------------------+
3| min(column_name) |
4+------------------+
5| 12 |
6+------------------+
string_agg
连接各字符串表达式的值,并在它们之间放置分隔符。
语法:string_agg(expression, delimiter)
参数:
expression:要连接的字符串表达式。可以是列或任何合法的字符串表达式。delimiter:用作连接值之间分隔符的字符串字面量。
示例:
1> SELECT string_agg(name, ', ') AS names_list
2 FROM employee;
3+---------------------+
4| names_list |
5+---------------------+
6| Alice, Bob, Charlie |
7+---------------------+
sum
返回指定列中所有值的总和。
语法:sum(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT sum(column_name) FROM table_name;
2+------------------+
3| sum(column_name) |
4+------------------+
5| 12345 |
6+------------------+
var
返回一组数字的统计样本方差。
语法:var(expression)
参数:
expression:要操作的数值表达式。可以是常量、列或函数,以及任意运算符组合。
别名:var_sample、var_samp
示例:
1> SELECT var(x) FROM (VALUES (1.0), (2.0), (3.0), (4.0)) AS t(x);
2+--------------------+
3| var(t.x) |
4+--------------------+
5| 1.6666666666666667 |
6+--------------------+
var_pop
返回一组数字的统计总体方差。
语法:var_pop(expression)
参数:
expression:要操作的数值表达式。可以是常量、列或函数,以及任意运算符组合。
别名:var_population
示例:
1> SELECT var_pop(x) FROM (VALUES (1.0), (2.0), (3.0), (4.0)) AS t(x);
2+--------------+
3| var_pop(t.x) |
4+--------------+
5| 1.25 |
6+--------------+
统计聚合
corr
返回两个数值之间的相关系数。
语法:corr(expression1, expression2)
参数:
expression1:要操作的第一个表达式。可以是常量、列或函数,以及任意运算符组合。expression2:要操作的第二个表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT corr(x, y) FROM (VALUES (1,1), (2,3), (3,2), (4,5)) AS t(x, y);
2+--------------------+
3| corr(t.x,t.y) |
4+--------------------+
5| 0.8315218406202999 |
6+--------------------+
covar_pop
返回一组数对的总体协方差。
语法:covar_pop(expression1, expression2)
参数:
expression1:要操作的第一个表达式。可以是常量、列或函数,以及任意运算符组合。expression2:要操作的第二个表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT covar_pop(x, y) FROM (VALUES (1,1), (2,3), (3,2), (4,5)) AS t(x, y);
2+--------------------+
3| covar_pop(t.x,t.y) |
4+--------------------+
5| 1.375 |
6+--------------------+
covar_samp
返回一组数对的样本协方差。
语法:covar_samp(expression1, expression2)
参数:
expression1:要操作的第一个表达式。可以是常量、列或函数,以及任意运算符组合。expression2:要操作的第二个表达式。可以是常量、列或函数,以及任意运算符组合。
别名:covar
示例:
1> SELECT covar_samp(x, y) FROM (VALUES (1,1), (2,3), (3,2), (4,5)) AS t(x, y);
2+---------------------+
3| covar_samp(t.x,t.y) |
4+---------------------+
5| 1.8333333333333333 |
6+---------------------+
regr_avgx
计算非 null 成对数据点中自变量(输入)expression_x 的平均值。
语法:regr_avgx(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_avgx(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+--------------------+
3| regr_avgx(t.y,t.x) |
4+--------------------+
5| 2.0 |
6+--------------------+
regr_avgy
计算非 null 成对数据点中因变量(输出)expression_y 的平均值。
语法:regr_avgy(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_avgy(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+--------------------+
3| regr_avgy(t.y,t.x) |
4+--------------------+
5| 4.0 |
6+--------------------+
regr_count
统计非 null 成对数据点的数量。
语法:regr_count(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_count(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+---------------------+
3| regr_count(t.y,t.x) |
4+---------------------+
5| 3 |
6+---------------------+
regr_intercept
计算线性回归线的 y 轴截距。对于方程 (y = kx + b),该函数返回 b。
语法:regr_intercept(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_intercept(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+-------------------------+
3| regr_intercept(t.y,t.x) |
4+-------------------------+
5| 0.0 |
6+-------------------------+
regr_r2
计算自变量与因变量之间相关系数的平方。
语法:regr_r2(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_r2(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+------------------+
3| regr_r2(t.y,t.x) |
4+------------------+
5| 1.0 |
6+------------------+
regr_slope
返回聚合列中非 null 数对的线性回归线斜率。给定输入列 Y 和 X:regr_slope(Y, X) 使用最小 RSS 拟合返回斜率(Y = k*X + b 中的 k)。
语法:regr_slope(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_slope(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+---------------------+
3| regr_slope(t.y,t.x) |
4+---------------------+
5| 2.0 |
6+---------------------+
regr_sxx
计算自变量的平方和。
语法:regr_sxx(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_sxx(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+-------------------+
3| regr_sxx(t.y,t.x) |
4+-------------------+
5| 2.0 |
6+-------------------+
regr_sxy
计算成对数据点的乘积和。
语法:regr_sxy(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_sxy(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+-------------------+
3| regr_sxy(t.y,t.x) |
4+-------------------+
5| 4.0 |
6+-------------------+
regr_syy
计算因变量的平方和。
语法:regr_syy(expression_y, expression_x)
参数:
expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符组合。expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT regr_syy(y, x) FROM (VALUES (1, 2), (2, 4), (3, 6)) AS t(x, y);
2+-------------------+
3| regr_syy(t.y,t.x) |
4+-------------------+
5| 8.0 |
6+-------------------+
stddev
返回一组数字的标准差。
语法:stddev(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
别名:stddev_samp
示例:
1> SELECT stddev(column_name) FROM table_name;
2+---------------------+
3| stddev(column_name) |
4+---------------------+
5| 12.34 |
6+---------------------+
stddev_pop
返回一组数字的总体标准差。
语法:stddev_pop(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT stddev_pop(column_name) FROM table_name;
2+-------------------------+
3| stddev_pop(column_name) |
4+-------------------------+
5| 10.56 |
6+-------------------------+
近似聚合
approx_distinct
返回使用 HyperLogLog 算法计算的输入值去重数量的近似值。
语法:approx_distinct(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT approx_distinct(column_name) FROM table_name;
2+------------------------------+
3| approx_distinct(column_name) |
4+------------------------------+
5| 42 |
6+------------------------------+
approx_median
返回输入值的近似中位数(第 50 百分位数)。它是 approx_percentile_cont(x, 0.5) 的别名。
语法:approx_median(expression)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。
示例:
1> SELECT approx_median(column_name) FROM table_name;
2+----------------------------+
3| approx_median(column_name) |
4+----------------------------+
5| 23.5 |
6+----------------------------+
approx_percentile_cont
使用 t-digest 算法返回输入值的近似百分位数。
语法:approx_percentile_cont(expression, percentile, centroids)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。percentile:要计算的百分位数。必须是 0 到 1 之间(含边界)的浮点值。centroids:t-digest 算法使用的质心数量。默认为 100。数值越大近似结果越精确,但需要更多内存。
示例:
1> SELECT approx_percentile_cont(column_name, 0.75, 100) FROM table_name;
2+----------------------------------------------+
3| approx_percentile_cont(column_name,0.75,100) |
4+----------------------------------------------+
5| 65.0 |
6+----------------------------------------------+
approx_percentile_cont_with_weight
使用 t-digest 算法返回输入值的加权近似百分位数。
语法:approx_percentile_cont_with_weight(expression, weight, percentile)
参数:
expression:要操作的表达式。可以是常量、列或函数,以及任意运算符组合。weight:用作权重的表达式。可以是常量、列或函数,以及任意算术运算符组合。percentile:要计算的百分位数。必须是 0 到 1 之间(含边界)的浮点值。
示例:
1> SELECT approx_percentile_cont_with_weight(column_name, weight_column, 0.90) FROM table_name;
2+--------------------------------------------------------------------+
3| approx_percentile_cont_with_weight(column_name,weight_column,0.90) |
4+--------------------------------------------------------------------+
5| 78.5 |
6+--------------------------------------------------------------------+
评价此篇文章
