聚合函数
聚合函数是指对一组数值进行统计计算,返回一个单一的数值结果。本文先准备一张表,接下来的函数介绍例子就使用这张表给计算结果。
f1 | f2 | f3 |
---|---|---|
10 | 20 | 30 |
20 | 30 | 40 |
30 | null | 50 |
40 | 50 | 60 |
50 | 60 | 70 |
60 | 70 | null |
avg
语法 | avg(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 获取指定数值列的平均值 |
例子 | avg({f1}), 返回值 35 |
corr
语法 | corr(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回两个数字列的相关系数 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(1000,1001)], corr({arg1}, {arg2}), 返回 1 |
count
语法 | count(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 数字 |
描述 | 获取指定列的值的数目 |
例子 | count({f2}),返回:5(不统计null值) |
covar_pop
语法 | covar_pop(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回两个数字列的总体协方差 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(1000,1001)], covar_pop({arg1}, {arg2}),返回 138058.47222222222 |
covar_samp
语法 | covar_samp(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回两个数字列的样本协方差 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(1000,1001)], covar_samp(arg1, arg2), 返回 165670.16666666666 |
distinct_count
语法 | distinct_count(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 数字 |
描述 | 获取指定列中非重复结果的数目 |
例子 | distinct_count({f2}),返回:5 |
不支持的数据源 | 无 |
first
语法 | first(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:ANY |
返回值类型 | ANY |
描述 | 获取指定列中第一个记录的值,它的值不是固定的 |
例子 | first({f1}),返回:10 |
last
语法 | last(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 任意类型 |
描述 | 获取指定列中最后一个记录的值,它的值不是固定的 |
例子 | last({f1}),返回:60 |
list_collect
语法 | list_collect(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意 |
返回值类型 | 数组 |
描述 | 聚合函数,把 arg 的参数收集为数组。(返回格式为数组类型,如果您发现显示为null,可以尝试将其转为字符串类型查看。) |
例子 | list_collect({f1}),返回:包含 f1 字段所有值的数组 |
list_collect_flatten
语法 | list_collect_flatten(ARR) |
---|---|
参数说明 | 数组类型参数,可选类型:数组 |
返回值类型 | 数组 |
描述 | 聚合函数,把 arr 的参数收集打平为数组。(返回格式为数组类型,如果您发现显示为null,可以尝试将其转为字符串类型查看。) |
例子 | list_collect_flatten({f1}),返回:把 f1 数组的所有元素拿出来,拼成一个新的数组。 |
max
语法 | max(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 任意类型 |
描述 | 获取指定数值列的最大值 |
例子 | max({f1}),返回:60 |
不支持的数据源 | 无 |
max_by
语法 | max_by(ARG, COMPARE) |
---|---|
参数说明 | 1. 参与计算的参数,可选类型:任意类型; 2. 对比数值,可选类型:任意类型 |
返回值类型 | 任意类型 |
描述 | 获取 compare 列最大那行对应的 arg 列的值,如有多个最大值取随机一个 |
例子 | max_by({f1},if(isnull({f2}),-1,{f2})),返回:60 |
median
语法 | median(ARG) |
---|---|
参数说明 | 数值类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 获取指定数值列的中位数 |
例子 | median({f1}),返回:35 |
min
语法 | min(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 任意类型 |
描述 | 获取指定数值列的最小值 |
例子 | min({f1}),返回:10 |
min_by
语法 | min_by(ARG, COMPARE) |
---|---|
参数说明 | 1. 参与计算的参数,可选类型:任意类型; 2. 对比数值,可选类型:任意类型 |
返回值类型 | 任意类型 |
描述 | 获取 compare 列最小那行对应的 arg 列的值,如有多个最小值取随机一个 |
例子 | min_by({f1},{f2}),返回:10 |
mode
语法 | mode() within group(ORDER BY expr2 [ DESC ] ) |
---|---|
参数说明 | expr2:用于排序的表达式,可选类型:ANY; DESC:可选参数,指定按降序排序,默认升序 |
返回值类型 | ANY |
描述 | 返回出现频次最高的一个值,频次相同则返回第一个 |
例子 | 对于数据 [1, 2, 2, 3, 3],mode() within group(ORDER BY value) 返回:2(2和3频次相同,返回先出现的2) |
nth
语法 | nth(ARG, I) |
---|---|
参数说明 | 1. 参与计算的参数,可选类型:任意类型; 2. 整数类型参数,可选类型:数字 |
返回值类型 | 任意类型 |
描述 | 获取第 i 个数值 |
例子 | nth({f1}, 2),返回:30(索引从1开始时) |
percentile
语法 | percentile(ARG, P) |
---|---|
参数说明 | 1. 数值类型参数,可选类型:数字; 2. 小数,0-1之间,可选类型:数字 |
返回值类型 | 数字 |
描述 | 计算百分位数 |
例子 | percentile({f1}, 50),返回:30) |
regr_avgx
语法 | regr_avgx(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回自变量的平均值(sum(ARG2)/N) |
例子 | regr_avgx({f1},{f2}),返回: 46 |
regr_avgy
语法 | regr_avgy(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回因变量的平均值(sum(ARG1)/N) |
例子 | regr_avgy({f1},{f2}),返回: 36 |
regr_count
语法 | regr_count(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 两个表达式都不为空的输入行的数目 |
例子 | regr_count({f1},{f2}),返回: 5 |
regr_intercept
语法 | regr_intercept(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 由(arg2, arg1)对决定的最小二乘拟合的线性方程的 arg1 截距 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(1000,1)], regr_intercept(arg1, arg2),返回 665.666666666666 |
regr_r2
语法 | regr_r2(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 相关系数的平方 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(10,1)], regr_r2({arg1}, {arg2}) = 0.06323185011709602 |
regr_slope
语法 | regr_slope(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | 由(arg2, arg1)对决定的最小二乘拟合的线性方程的斜率 |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(10,1)], regr_slope(arg1, arg2) = -0.42857142857142855 |
regr_sxx
语法 | regr_sxx(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | sum(arg2^2) - sum(arg2)^2/N(自变量的“平方和”) |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(10,1)], regr_sxx(arg1, arg2) = 17.5 |
regr_sxy
语法 | regr_sxy(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | sum(arg2 * arg1) - sum(arg2) * sum(arg1)/N(自变量乘以因变量的“积之合”) |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(10,1)], regr_sxy(arg1, arg2) = -7.5 |
regr_syy
语法 | regr_syy(ARG1, ARG2) |
---|---|
参数说明 | 1. ARG1,可选类型:数字; 2. ARG2,可选类型:数字 |
返回值类型 | 数字 |
描述 | sum(arg1^2) - sum(arg1)^2/N(因变量的“平方和”) |
例子 | (arg1, arg2) = [(1,2),(2,3),(3,4),(4,5),(5,6),(10,1)], regr_syy(arg1, arg2) = 50.833333333333336 |
set_collect
语法 | set_collect(ARG) |
---|---|
参数说明 | 参与计算的参数,可选类型:任意类型 |
返回值类型 | 数组 |
描述 | 聚合函数,把 arg 的参数收集为去重数组。(返回格式为数组类型,如果您发现显示为null,可以尝试将其转为字符串类型查看。) |
例子 | set_collect([1, 2, 2, 3]),返回:[1, 2, 3] |
set_collect_flatten
语法 | set_collect_flatten(ARR) |
---|---|
参数说明 | 数组类型参数,可选类型:数组 |
返回值类型 | 数组 |
描述 | 聚合函数,把 arr 的参数收集打平为去重数组。(返回格式为数组类型,如果您发现显示为null,可以尝试将其转为字符串类型查看。) |
例子 | set_collect_flatten([[1, 2], [2, 3]]),返回:[1, 2, 3] |
stddev_pop
语法 | stddev_pop(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回数字列的总体标准偏差 |
例子 | n = [(1000),(1001),(1003),(1004),(1005),(1000)], stddev_pop(n) = 1.9507833184532709 |
stddev_samp
语法 | stddev_samp(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回数字列的样本标准偏差 |
例子 | n = [(1000),(1001),(1003),(1004),(1005),(1000)], stddev_samp(n) = 2.1369760566432809 |
string_agg
语法 | string_agg(S, DELIMITER) |
---|---|
参数说明 | 1. S:需要拼接的字段,可选类型:任意类型; 2. DELIMITER:分隔符,可选类型:字符串 |
返回值类型 | 字符串 |
描述 | 把字段 S 拼接成字符串,中间用 DELIMITER 进行分割,其中 oracle 必须带有 within group 子句 |
例子 | string_agg(['a', 'b', 'c'], ','),返回:'a,b,c' |
sum
语法 | sum(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 获取指定数值列的和 |
例子 | sum({f1}),返回:210 |
var_pop
语法 | var_pop(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回数字列的总体方差 |
例子 | n = [(1000),(1001),(1003),(1004),(1005),(1000)], var_pop(n) = 3.8055555555555554(注:原示例描述有误,实际为总体方差) |
var_samp
语法 | var_samp(N) |
---|---|
参数说明 | 数字类型参数,可选类型:数字 |
返回值类型 | 数字 |
描述 | 返回数字列的样本方差(样本标准偏差的平方) |
例子 | n = [(1000),(1001),(1003),(1004),(1005),(1000)], var_samp(n) = 4.5666666666666667 |
添加过滤条件
支持在聚合计算表达式后面使用 filter 子句,实现过滤的效果。语法如下,其中 filter_clause 是过滤条件
aggregate_name(expression ...) FILTER (WHERE filter_clause )
- 示例1:
sum({f1}) FILTER (WHERE {f1} > 10)
表示对 f1 字段大于 10 的数据进行求和。
- 示例2:
avg({f1}) FILTER (WHERE {f1} > 10 AND {f2} = 'abc')
表示对 f1 字段大于 10 且 f2 字段等于 'abc' 的数据进行求和。
添加排序语句
添加排序语句可以对聚合结果进行排序。支持排序语句的函数有:first, last, mode, percentile, string_agg。 语法如下,其中 order_clause 是排序条件。
aggregate_name(expression ...) within group(ORDER BY order_clause)
- 示例1:
first({f1}) within group(ORDER BY {f2})
表示对 f1 字段按照 f2 字段进行排序,取每组第一个 f1 字段的值。
- 示例2:
last({f1}) within group(ORDER BY {f2})
表示对 f1 字段按照 f2 字段进行排序,取每组最后一个 f1 字段的值。
- 示例3:
percentile({f1}, 0.5) within group(ORDER BY {f2})
表示对 f1 字段按照 f2 字段进行排序,取每组排在 50% 位置的 f1 字段的值。