SQL 参考

聚合函数

师成师成· 更新于 2026-09-28· 阅读 80 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

聚合函数

聚合函数对一组值进行运算,计算出单个结果。

FILTER 子句

聚合函数支持 SQL 的 FILTER (WHERE ...) 子句,用于限定哪些输入行参与聚合结果的计算。

function([exprs]) FILTER (WHERE condition)

示例:

SELECT
  sum(salary) FILTER (WHERE salary > 0) AS sum_positive_salaries,
  count(*)    FILTER (WHERE active)     AS active_count
FROM employees;

注意:当没有行通过筛选时,COUNT 返回 0,而 SUM/AVG/MIN/MAX 返回 NULL。

WITHIN GROUP / 有序集聚合函数

部分聚合函数接受 SQL 的 WITHIN GROUP (ORDER BY ...) 子句,用于指定该聚合所依赖的排序方式。在 DataFusion 中,这一功能是可选启用的:只有当聚合函数的实现在 AggregateUDFImpl::supports_within_group_clause() 中返回 true 时,该函数才接受 WITHIN GROUP 子句。若对普通聚合函数使用 WITHIN GROUP(例如 SELECT SUM(x) WITHIN GROUP (ORDER BY x)),会在计划阶段失败并报错:“WITHIN GROUP is only supported for ordered-set aggregate functions”。

目前,支持 WITHIN GROUP 的内置聚合函数有:

  • percentile_cont — 精确百分位聚合(也可写作 percentile_cont(column, percentile))
  • approx_percentile_cont — 使用 t-digest 算法的近似百分位
  • approx_percentile_cont_with_weight — 使用 t-digest 算法的加权近似百分位

注意:rank()、dense_rank() 和 percent_rank() 等排名类函数属于窗口函数,使用 OVER (...) 子句;它们并非 DataFusion 中接受 WITHIN GROUP 的有序集聚合函数。

示例(有序集聚合):

percentile_cont(0.5) WITHIN GROUP (ORDER BY value)

示例(无效用法——计划器将报错):

-- This will fail: SUM is not an ordered-set aggregate
SELECT SUM(x) WITHIN GROUP (ORDER BY x) FROM t;

通用函数

any_value

返回分组中任意一个非空值;如果该分组中只包含 NULL 值,则返回 NULL。

any_value(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是各种运算符的任意组合。

示例

> SELECT any_value(column_name) FROM table_name;
+------------------------+
| any_value(column_name) |
+------------------------+
| arbitrary_value        |
+------------------------+

array_agg

返回由表达式元素组成的数组。如果需要排序,则按指定顺序插入元素。该聚合函数只有在排序表达式与参数表达式完全相同时,才能混合使用 DISTINCT 和 ORDER BY。

array_agg(expression [ORDER BY expression])

参数

  • expression:要操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT array_agg(column_name ORDER BY other_column) FROM table_name;
+-----------------------------------------------+
| array_agg(column_name ORDER BY other_column)  |
+-----------------------------------------------+
| [element1, element2, element3]                |
+-----------------------------------------------+
> SELECT array_agg(DISTINCT column_name ORDER BY column_name) FROM table_name;
+--------------------------------------------------------+
| array_agg(DISTINCT column_name ORDER BY column_name)   |
+--------------------------------------------------------+
| [element1, element2, element3]                         |
+--------------------------------------------------------+

avg

返回指定列中数值的平均值。

avg(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT avg(column_name) FROM table_name;
+---------------------------+
| avg(column_name)          |
+---------------------------+
| 42.75                     |
+---------------------------+

别名

  • mean

bit_and

计算所有非空输入值的按位与。

bit_and(expression)

参数

  • expression:要进行运算的整数表达式。可以是常量、列或函数,以及任意组合的运算符。

bit_or

计算所有非空输入值的按位或。

bit_or(expression)

参数

  • expression:要操作的整数表达式。可以是常量、列或函数,以及任意运算符的组合。

bit_xor

计算所有非空输入值的按位异或。

bit_xor(expression)

参数

  • expression:要操作的整数表达式。可以是常量、列或函数,以及任意的运算符组合。

bool_and

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

bool_and(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT bool_and(column_name) FROM table_name;
+----------------------------+
| bool_and(column_name)      |
+----------------------------+
| true                       |
+----------------------------+

bool_or

如果任意一个非空输入值为 true,则返回 true,否则返回 false。

bool_or(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT bool_or(column_name) FROM table_name;
+----------------------------+
| bool_or(column_name)       |
+----------------------------+
| true                       |
+----------------------------+

count

返回指定列中非空值的数量。若要在总数中包含 NULL 值,请使用 count(*)。

count(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT count(column_name) FROM table_name;
+-----------------------+
| count(column_name)    |
+-----------------------+
| 100                   |
+-----------------------+

> SELECT count(*) FROM table_name;
+------------------+
| count(*)         |
+------------------+
| 120              |
+------------------+

first_value

按照指定的排序方式返回聚合分组中的第一个元素。如果未指定排序方式,则从分组中任意返回一个元素。

first_value(expression [ORDER BY expression])

参数

  • expression:要进行运算的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT first_value(column_name ORDER BY other_column) FROM table_name;
+------------------------------------------------+
| first_value(column_name ORDER BY other_column) |
+------------------------------------------------+
| first_element                                  |
+------------------------------------------------+

grouping

如果数据在指定列上进行了聚合,则返回 1;如果在结果集中未对该列进行聚合,则返回 0。

grouping(expression)

参数

  • expression:用于评估数据是否在指定列上进行聚合的表达式。可以是常量、列或函数。

示例

> SELECT column_name, GROUPING(column_name) AS group_column
  FROM table_name
  GROUP BY GROUPING SETS ((column_name), ());
+-------------+--------------+
| column_name | group_column |
+-------------+--------------+
| value1      | 0            |
| value2      | 0            |
| NULL        | 1            |
+-------------+--------------+

last_value

根据指定的排序方式返回聚合分组中的最后一个元素。如果未指定排序方式,则从分组中返回任意一个元素。

last_value(expression [ORDER BY expression])

参数

  • expression:要进行运算的表达式。可以是常量、列或函数,以及任意的运算符组合。

示例

> SELECT last_value(column_name ORDER BY other_column) FROM table_name;
+-----------------------------------------------+
| last_value(column_name ORDER BY other_column) |
+-----------------------------------------------+
| last_element                                  |
+-----------------------------------------------+

max

返回指定列中的最大值。

max(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是各种运算符的任意组合。

示例

> SELECT max(column_name) FROM table_name;
+----------------------+
| max(column_name)     |
+----------------------+
| 150                  |
+----------------------+

mean

avg 的别名。

median

返回指定列中的中位数。

median(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

> SELECT median(column_name) FROM table_name;
+----------------------+
| median(column_name)  |
+----------------------+
| 45.5                 |
+----------------------+

min

返回指定列中的最小值。

min(expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT min(column_name) FROM table_name;
+----------------------+
| min(column_name)     |
+----------------------+
| 12                   |
+----------------------+

percentile_cont

返回输入值的精确百分位数,必要时在相邻数值之间进行插值。

percentile_cont(percentile) WITHIN GROUP (ORDER BY expression)

参数

  • expression:要进行运算的表达式。可以是常量、列或函数,以及运算符的任意组合。
  • percentile:要计算的百分位数。必须是介于 0 和 1 之间(含)的浮点值。

示例

> SELECT percentile_cont(0.75) WITHIN GROUP (ORDER BY column_name) FROM table_name;
+-----------------------------------------------------------+
| percentile_cont(0.75) WITHIN GROUP (ORDER BY column_name) |
+-----------------------------------------------------------+
| 45.5                                                      |
+-----------------------------------------------------------+

同时也支持另一种语法:

> SELECT percentile_cont(column_name, 0.75) FROM table_name;
+---------------------------------------+
| percentile_cont(column_name, 0.75)    |
+---------------------------------------+
| 45.5                                  |
+---------------------------------------+

别名

  • quantile_cont

quantile_cont

percentile_cont 的别名。

string_agg

将字符串表达式的值连接起来,并在它们之间插入分隔值。如果需要排序,字符串将按指定的顺序连接。此聚合函数只有在排序表达式与第一个参数表达式完全相同时,才能混合使用 DISTINCT 和 ORDER BY。

string_agg([DISTINCT] expression, delimiter [ORDER BY expression])

参数

  • expression:要拼接的字符串表达式。可以是列,也可以是任意有效的字符串表达式。
  • delimiter:用作拼接各值之间分隔符的字符串字面量。

示例

> SELECT string_agg(name, ', ') AS names_list
  FROM employee;
+--------------------------+
| names_list               |
+--------------------------+
| Alice, Bob, Bob, Charlie |
+--------------------------+
> SELECT string_agg(name, ', ' ORDER BY name DESC) AS names_list
  FROM employee;
+--------------------------+
| names_list               |
+--------------------------+
| Charlie, Bob, Bob, Alice |
+--------------------------+
> SELECT string_agg(DISTINCT name, ', ' ORDER BY name DESC) AS names_list
  FROM employee;
+--------------------------+
| names_list               |
+--------------------------+
| Charlie, Bob, Alice      |
+--------------------------+

sum

返回指定列中所有值的总和。

sum(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

> SELECT sum(column_name) FROM table_name;
+-----------------------+
| sum(column_name)      |
+-----------------------+
| 12345                 |
+-----------------------+

var

返回一组数字的样本方差。

var(expression)

参数

  • expression:要进行运算的数值表达式。可以是常量、列或函数,以及任意组合的运算符。

别名

  • var_sample
  • var_samp

var_pop

返回一组数字的统计总体方差。

var_pop(expression)

参数

  • expression:要操作的数值表达式。可以是常量、列或函数,以及任意运算符的组合。

别名

  • var_population

var_population

var_pop 的别名。

var_samp

var 的别名。

var_sample

var 的别名。

统计函数

corr

返回两个数值之间的相关系数。

corr(expression1, expression2)

参数

  • expression1:要参与运算的第一个表达式。可以是常量、列或函数,也可以是任意运算符的组合。
  • expression2:要参与运算的第二个表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT corr(column1, column2) FROM table_name;
+--------------------------------+
| corr(column1, column2)         |
+--------------------------------+
| 0.85                           |
+--------------------------------+

covar

covar_samp 的别名。

covar_pop

返回一组数值对的总体协方差。

covar_pop(expression1, expression2)

参数

  • expression1:要处理的第一个表达式。可以是常量、列或函数,也可以是任意运算符的组合。
  • expression2:要处理的第二个表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT covar_pop(column1, column2) FROM table_name;
+-----------------------------------+
| covar_pop(column1, column2)       |
+-----------------------------------+
| 7.63333333333                     |
+-----------------------------------+

covar_samp

返回一组数对的样本协方差。

covar_samp(expression1, expression2)

参数

  • expression1:要参与运算的第一个表达式。可以是常量、列或函数,也可以是任意运算符的组合。
  • expression2:要参与运算的第二个表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT covar_samp(column1, column2) FROM table_name;
+-----------------------------------+
| covar_samp(column1, column2)      |
+-----------------------------------+
| 8.25                              |
+-----------------------------------+

别名

  • covar

nth_value

返回一组值中的第 n 个值。

nth_value(expression, n ORDER BY expression)

参数

  • expression:要从中获取第 n 个值的列或表达式。
  • n:要获取的值的位置。正值从第一个值开始计数,起始为 1;负值从最后一个值开始反向计数,其中 -1 返回最后一个值。

示例

> SELECT dept_id, salary, NTH_VALUE(salary, 2) OVER (PARTITION BY dept_id ORDER BY salary ASC) AS second_salary_by_dept
  FROM employee;
+---------+--------+-------------------------+
| dept_id | salary | second_salary_by_dept   |
+---------+--------+-------------------------+
| 1       | 30000  | NULL                    |
| 1       | 40000  | 40000                   |
| 1       | 50000  | 40000                   |
| 2       | 35000  | NULL                    |
| 2       | 45000  | 45000                   |
+---------+--------+-------------------------+

regr_avgx

计算非空配对数据点中自变量(输入)表达式 x 的平均值。

regr_avgx(expression_y, expression_x)

参数

  • expression_y:要处理的因变量表达式。可以是常量、列或函数,以及任意运算符的组合。
  • expression_x:要处理的自变量表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

create table daily_sales(day int, total_sales int) as values (1,100), (2,150), (3,200), (4,NULL), (5,250);
select * from daily_sales;
+-----+-------------+
| day | total_sales |
+-----+-------------+
| 1   | 100         |
| 2   | 150         |
| 3   | 200         |
| 4   | NULL        |
| 5   | 250         |
+-----+-------------+

SELECT regr_avgx(total_sales, day) AS avg_day FROM daily_sales;
+----------+
| avg_day  |
+----------+
|   2.75   |
+----------+

regr_avgy

计算非空配对数据点中因变量(输出)表达式_y 的平均值。

regr_avgy(expression_y, expression_x)

参数

  • expression_y:要处理的因变量表达式。可以是常量、列或函数,以及任意的运算符组合。
  • expression_x:要处理的自变量表达式。可以是常量、列或函数,以及任意的运算符组合。

示例

create table daily_temperature(day int, temperature int) as values (1,30), (2,32), (3, NULL), (4,35), (5,36);
select * from daily_temperature;
+-----+-------------+
| day | temperature |
+-----+-------------+
| 1   | 30          |
| 2   | 32          |
| 3   | NULL        |
| 4   | 35          |
| 5   | 36          |
+-----+-------------+

-- temperature as Dependent Variable(Y), day as Independent Variable(X)
SELECT regr_avgy(temperature, day) AS avg_temperature FROM daily_temperature;
+-----------------+
| avg_temperature |
+-----------------+
| 33.25           |
+-----------------+

regr_count

统计非空成对数据点的数量。

regr_count(expression_y, expression_x)

参数

  • expression_y:要进行运算的因变量表达式。可以是常量、列或函数,以及各种运算符的任意组合。
  • expression_x:要进行运算的自变量表达式。可以是常量、列或函数,以及各种运算符的任意组合。

示例

create table daily_metrics(day int, user_signups int) as values (1,100), (2,120), (3, NULL), (4,110), (5,NULL);
select * from daily_metrics;
+-----+---------------+
| day | user_signups  |
+-----+---------------+
| 1   | 100           |
| 2   | 120           |
| 3   | NULL          |
| 4   | 110           |
| 5   | NULL          |
+-----+---------------+

SELECT regr_count(user_signups, day) AS valid_pairs FROM daily_metrics;
+-------------+
| valid_pairs |
+-------------+
| 3           |
+-------------+

regr_intercept

计算线性回归直线的 y 轴截距。对于方程 y = kx + b,该函数返回 b。

regr_intercept(expression_y, expression_x)

参数

  • expression_y:要进行运算的因变量表达式。可以是常量、列或函数,以及任意运算符的组合。
  • expression_x:要进行运算的自变量表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

create table weekly_performance(week int, productivity_score int) as values (1,60), (2,65), (3, 70), (4,75), (5,80);
select * from weekly_performance;
+------+---------------------+
| week | productivity_score  |
+------+---------------------+
| 1    | 60                  |
| 2    | 65                  |
| 3    | 70                  |
| 4    | 75                  |
| 5    | 80                  |
+------+---------------------+

SELECT regr_intercept(productivity_score, week) AS intercept FROM weekly_performance;
+-----------+
| intercept |
+-----------+
| 55        |
+-----------+

regr_r2

计算自变量与因变量之间相关系数的平方。

regr_r2(expression_y, expression_x)

参数

  • expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符的组合。
  • expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

create table weekly_performance(day int ,user_signups int) as values (1,60), (2,65), (3, 70), (4,75), (5,80);
select * from weekly_performance;
+-----+--------------+
| day | user_signups |
+-----+--------------+
| 1   | 60           |
| 2   | 65           |
| 3   | 70           |
| 4   | 75           |
| 5   | 80           |
+-----+--------------+

SELECT regr_r2(user_signups, day) AS r_squared FROM weekly_performance;
+-----------+
| r_squared |
+-----------+
| 1.0       |
+-----------+

regr_slope

返回聚合列中非空数据对的线性回归直线斜率。给定输入列 Y 和 X:regr_slope(Y, X) 使用最小残差平方和(RSS)拟合,返回斜率(即 Y = k*X + b 中的 k)。

regr_slope(expression_y, expression_x)

参数

  • expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符的组合。
  • expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

create table weekly_performance(day int, user_signups int) as values (1,60), (2,65), (3, 70), (4,75), (5,80);
select * from weekly_performance;
+-----+--------------+
| day | user_signups |
+-----+--------------+
| 1   | 60           |
| 2   | 65           |
| 3   | 70           |
| 4   | 75           |
| 5   | 80           |
+-----+--------------+

SELECT regr_slope(user_signups, day) AS slope FROM weekly_performance;
+--------+
| slope  |
+--------+
| 5.0    |
+--------+

regr_sxx

计算自变量的平方和。

regr_sxx(expression_y, expression_x)

参数

  • expression_y:要操作的因变量表达式。可以是常量、列或函数,以及任意运算符的组合。
  • expression_x:要操作的自变量表达式。可以是常量、列或函数,以及任意运算符的组合。

示例

create table study_hours(student_id int, hours int, test_score int) as values (1,2,55), (2,4,65), (3,6,75), (4,8,85), (5,10,95);
select * from study_hours;
+------------+-------+------------+
| student_id | hours | test_score |
+------------+-------+------------+
| 1          | 2     | 55         |
| 2          | 4     | 65         |
| 3          | 6     | 75         |
| 4          | 8     | 85         |
| 5          | 10    | 95         |
+------------+-------+------------+

SELECT regr_sxx(test_score, hours) AS sxx FROM study_hours;
+------+
| sxx  |
+------+
| 40.0 |
+------+

regr_sxy

计算成对数据点乘积之和。

regr_sxy(expression_y, expression_x)

参数

  • expression_y:要进行运算的因变量表达式。可以是常量、列或函数,以及任意的运算符组合。
  • expression_x:要进行运算的自变量表达式。可以是常量、列或函数,以及任意的运算符组合。

示例

create table employee_productivity(week int, productivity_score int) as values(1,60), (2,65), (3,70);
select * from employee_productivity;
+------+--------------------+
| week | productivity_score |
+------+--------------------+
| 1    | 60                 |
| 2    | 65                 |
| 3    | 70                 |
+------+--------------------+

SELECT regr_sxy(productivity_score, week) AS sum_product_deviations FROM employee_productivity;
+------------------------+
| sum_product_deviations |
+------------------------+
|       10.0             |
+------------------------+

regr_syy

计算因变量的平方和。

regr_syy(expression_y, expression_x)

参数

  • expression_y:要进行运算的因变量表达式。可以是常量、列或函数,以及任意的运算符组合。
  • expression_x:要进行运算的自变量表达式。可以是常量、列或函数,以及任意的运算符组合。

示例

create table employee_productivity(week int, productivity_score int) as values (1,60), (2,65), (3,70);
select * from employee_productivity;
+------+--------------------+
| week | productivity_score |
+------+--------------------+
| 1    | 60                 |
| 2    | 65                 |
| 3    | 70                 |
+------+--------------------+

SELECT regr_syy(productivity_score, week) AS sum_squares_y FROM employee_productivity;
+---------------+
| sum_squares_y |
+---------------+
|    50.0       |
+---------------+

stddev

返回一组数字的标准差。

stddev(expression)

参数

  • expression:要进行操作的表达式。可以是常量、列或函数,也可以是各种运算符的任意组合。

示例

> SELECT stddev(column_name) FROM table_name;
+----------------------+
| stddev(column_name)  |
+----------------------+
| 12.34                |
+----------------------+

别名

  • stddev_samp

stddev_pop

返回一组数字的总体标准差。

stddev_pop(expression)

参数

  • expression:要进行运算的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT stddev_pop(column_name) FROM table_name;
+--------------------------+
| stddev_pop(column_name)  |
+--------------------------+
| 10.56                    |
+--------------------------+

stddev_samp

stddev 的别名。

近似函数

approx_distinct

返回使用 HyperLogLog 算法计算出的输入值近似去重数量。

approx_distinct(expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT approx_distinct(column_name) FROM table_name;
+-----------------------------------+
| approx_distinct(column_name)      |
+-----------------------------------+
| 42                                |
+-----------------------------------+

approx_median

返回输入值的近似中位数(第 50 百分位数)。它是 approx_percentile_cont(0.5) WITHIN GROUP (ORDER BY x) 的别名。

approx_median(expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,也可以是任意运算符的组合。

示例

> SELECT approx_median(column_name) FROM table_name;
+-----------------------------------+
| approx_median(column_name)        |
+-----------------------------------+
| 23.5                              |
+-----------------------------------+

approx_percentile_cont

使用 t-digest 算法返回输入值的近似百分位数。

approx_percentile_cont(percentile [, centroids]) WITHIN GROUP (ORDER BY expression)

参数

  • expression:要进行运算的表达式。可以是常量、列或函数,也可以是任意运算符的组合。
  • percentile:要计算的百分位数。必须是介于 0 和 1 之间(包含 0 和 1)的浮点值。
  • centroids:t-digest 算法中使用的质心数量。默认值为 100。数值越大,近似结果越精确,但占用的内存也越多。

示例

> SELECT approx_percentile_cont(0.75) WITHIN GROUP (ORDER BY column_name) FROM table_name;
+------------------------------------------------------------------+
| approx_percentile_cont(0.75) WITHIN GROUP (ORDER BY column_name) |
+------------------------------------------------------------------+
| 65.0                                                             |
+------------------------------------------------------------------+
> SELECT approx_percentile_cont(0.75, 100) WITHIN GROUP (ORDER BY column_name) FROM table_name;
+-----------------------------------------------------------------------+
| approx_percentile_cont(0.75, 100) WITHIN GROUP (ORDER BY column_name) |
+-----------------------------------------------------------------------+
| 65.0                                                                  |
+-----------------------------------------------------------------------+

也支持另一种语法:

> SELECT approx_percentile_cont(column_name, 0.75) FROM table_name;
+-----------------------------------------------+
| approx_percentile_cont(column_name, 0.75)     |
+-----------------------------------------------+
| 65.0                                          |
+-----------------------------------------------+

> SELECT approx_percentile_cont(column_name, 0.75, 100) FROM table_name;
+----------------------------------------------------------+
| approx_percentile_cont(column_name, 0.75, 100)           |
+----------------------------------------------------------+
| 65.0                                                     |
+----------------------------------------------------------+

approx_percentile_cont_with_weight

使用 t-digest 算法返回输入值的加权近似百分位数。

approx_percentile_cont_with_weight(weight, percentile [, centroids]) WITHIN GROUP (ORDER BY expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及任意组合的运算符。
  • weight:用作权重的表达式。可以是常量、列或函数,以及任意组合的算术运算符。
  • percentile:要计算的百分位数。必须是介于 0 和 1 之间(含端点)的浮点值。
  • centroids:t-digest 算法中使用的质心数量。默认值为 100。数值越大,近似结果越精确,但占用的内存也越多。

示例

> SELECT approx_percentile_cont_with_weight(weight_column, 0.90) WITHIN GROUP (ORDER BY column_name) FROM table_name;
+---------------------------------------------------------------------------------------------+
| approx_percentile_cont_with_weight(weight_column, 0.90) WITHIN GROUP (ORDER BY column_name) |
+---------------------------------------------------------------------------------------------+
| 78.5                                                                                        |
+---------------------------------------------------------------------------------------------+
> SELECT approx_percentile_cont_with_weight(weight_column, 0.90, 100) WITHIN GROUP (ORDER BY column_name) FROM table_name;
+--------------------------------------------------------------------------------------------------+
| approx_percentile_cont_with_weight(weight_column, 0.90, 100) WITHIN GROUP (ORDER BY column_name) |
+--------------------------------------------------------------------------------------------------+
| 78.5                                                                                             |
+--------------------------------------------------------------------------------------------------+

还支持另一种语法:

> SELECT approx_percentile_cont_with_weight(column_name, weight_column, 0.90) FROM table_name;
+----------------------------------------------------------------------+
| approx_percentile_cont_with_weight(column_name, weight_column, 0.90) |
+----------------------------------------------------------------------+
| 78.5                                                                 |
+----------------------------------------------------------------------+

评论

登录后参与评论

正在加载评论…