文章目录
- 一、分类总览
- 1、函数分类
- 2、全部函数
- 二、聚合函数基础
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 三、基础聚合类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 四、计数 / 去重类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 五、极值关联取值类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 六、布尔 / 位聚合类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 七、集合 / Map / 字符串类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 八、统计分析类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 九、百分位 / 分布类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 十、最容易混淆的函数对比
- 十一、参考资料
一、分类总览
1、函数分类
| 分类 | 主要解决的问题 | 代表函数 |
|---|---|---|
| 1、基础聚合类 | 求和、平均、最大、最小、中位数、任取一个值 | SUM、AVG、MAX、MIN、MEDIAN、ANY_VALUE |
| 2、计数 / 去重类 | 行数统计、条件计数、近似去重 | COUNT、COUNT_IF、APPROX_DISTINCT |
| 3、极值关联取值类 | 找最大/最小指标对应的另一列值 | ARG_MAX、ARG_MIN、MAX_BY、MIN_BY |
| 4、布尔 / 位聚合类 | 布尔逻辑与或、位运算聚合 | ANY、BOOL_AND、BOOL_OR、BITWISE_AND_AGG、BITWISE_OR_AGG、BITWISE_XOR_AGG |
| 5、集合 / Map / 字符串类 | 聚合成数组、Map、字符串 | COLLECT_LIST、COLLECT_SET、MAP_AGG、MAP_UNION、MAP_UNION_SUM、MULTIMAP_AGG、HISTOGRAM、WM_CONCAT |
| 6、统计分析类 | 相关性、协方差、标准差、方差 | CORR、COVAR_POP、COVAR_SAMP、STDDEV、STDDEV_SAMP、VAR_SAMP、VARIANCE/VAR_POP |
| 7、百分位 / 分布类 | 百分位和近似分布 | PERCENTILE、PERCENTILE_APPROX、PERCENTILE_CONT、PERCENTILE_DISC、NUMERIC_HISTOGRAM |
2、全部函数
| 分类 | 函数 | 功能 |
|---|---|---|
| 1、基础聚合类 | ANY_VALUE | 在指定范围内任选一个非 NULL 值返回 |
| 1、基础聚合类 | AVG | 计算平均值 |
| 1、基础聚合类 | MAX | 计算最大值 |
| 1、基础聚合类 | MEDIAN | 计算中位数 |
| 1、基础聚合类 | MIN | 计算最小值 |
| 1、基础聚合类 | SUM | 计算汇总值 |
| 2、计数 / 去重类 | APPROX_DISTINCT | 计算非重复值的近似数量 |
| 2、计数 / 去重类 | COUNT | 计算记录数 |
| 2、计数 / 去重类 | COUNT_IF | 计算条件为 TRUE 的记录数 |
| 3、极值关联取值类 | ARG_MAX | 返回最大值对应行的另一列值 |
| 3、极值关联取值类 | ARG_MIN | 返回最小值对应行的另一列值 |
| 3、极值关联取值类 | MAX_BY | 返回最大值对应行的另一列值 |
| 3、极值关联取值类 | MIN_BY | 返回最小值对应行的另一列值 |
| 4、布尔 / 位聚合类 | ANY | 判断是否至少存在一个 TRUE |
| 4、布尔 / 位聚合类 | BOOL_AND | 对一组布尔值执行 AND |
| 4、布尔 / 位聚合类 | BOOL_OR | 对一组布尔值执行 OR |
| 4、布尔 / 位聚合类 | BITWISE_AND_AGG | 对整数执行按位 AND 聚合 |
| 4、布尔 / 位聚合类 | BITWISE_OR_AGG | 对整数执行按位 OR 聚合 |
| 4、布尔 / 位聚合类 | BITWISE_XOR_AGG | 对整数执行按位 XOR 聚合 |
| 5、集合 / Map / 字符串类 | COLLECT_LIST | 聚合为保留重复值的数组 |
| 5、集合 / Map / 字符串类 | COLLECT_SET | 聚合为去重数组 |
| 5、集合 / Map / 字符串类 | HISTOGRAM | 统计每个值出现次数并构造 Map |
| 5、集合 / Map / 字符串类 | MAP_AGG | 将两列聚合为 Key-Value Map |
| 5、集合 / Map / 字符串类 | MAP_UNION | 合并多个 Map |
| 5、集合 / Map / 字符串类 | MAP_UNION_SUM | 合并多个 Map,并对相同 Key 的数值求和 |
| 5、集合 / Map / 字符串类 | MULTIMAP_AGG | 聚合为 Key → Array 的 Map |
| 5、集合 / Map / 字符串类 | WM_CONCAT | 使用指定分隔符聚合字符串 |
| 6、统计分析类 | CORR | 计算皮尔逊相关系数 |
| 6、统计分析类 | COVAR_POP | 计算总体协方差 |
| 6、统计分析类 | COVAR_SAMP | 计算样本协方差 |
| 6、统计分析类 | STDDEV | 计算总体标准差 |
| 6、统计分析类 | STDDEV_SAMP | 计算样本标准差 |
| 6、统计分析类 | VAR_SAMP | 计算样本方差 |
| 6、统计分析类 | VARIANCE / VAR_POP | 计算总体方差 |
| 7、百分位 / 分布类 | NUMERIC_HISTOGRAM | 计算数值列的近似直方图 |
| 7、百分位 / 分布类 | PERCENTILE | 计算精确百分位,适合较小数据量 |
| 7、百分位 / 分布类 | PERCENTILE_APPROX | 计算近似百分位,适合大数据量 |
| 7、百分位 / 分布类 | PERCENTILE_CONT | 计算连续型精确百分位,可线性插值 |
| 7、百分位 / 分布类 | PERCENTILE_DISC | 计算离散型百分位,返回实际存在的值 |
二、聚合函数基础
| 语法 | 功能 |
|---|---|
GROUP BY | 按字段分组后分别聚合 |
DISTINCT | 聚合前去重 |
FILTER (WHERE ...) | 只对满足条件的数据参与聚合 |
WITHIN GROUP (ORDER BY ...) | 聚合前先对组内数据排序 |
1、定义
聚合函数将多条记录汇总成一个结果。
常见形式:
SELECTdeptno,SUM(sal)FROMempGROUPBYdeptno;2、区别
| 写法 | 核心区别 |
|---|---|
GROUP BY | 决定按什么维度分别计算 |
DISTINCT | 先去重,再参与聚合 |
FILTER | 只让满足条件的记录进入聚合函数 |
WITHIN GROUP | 聚合之前先定义组内顺序 |
其中WITHIN GROUP主要用于需要顺序的聚合函数,例如WM_CONCAT、COLLECT_LIST、COLLECT_SET。
3、简单记忆
GROUP BY= 分组算。DISTINCT= 去重算。FILTER= 筛完再算。WITHIN GROUP= 排完再聚。
4、案例
-- 结果:按部门分别统计工资总额SELECTdeptno,SUM(sal)AStotal_salFROMempGROUPBYdeptno;-- 结果:统计不同部门数量SELECTCOUNT(DISTINCTdeptno)ASdept_cntFROMemp;-- 结果:分别统计 10、20、30 部门工资总额SELECTSUM(sal)FILTER(WHEREdeptno=10),SUM(sal)FILTER(WHEREdeptno=20),SUM(sal)FILTER(WHEREdeptno=30)FROMemp;-- 结果:1,2,3SELECTWM_CONCAT(',',y)WITHINGROUP(ORDERBYy)FROMVALUES('k',1),('k',3),('k',2)ASt(x,y)GROUPBYx;三、基础聚合类
| 函数 | 功能 |
|---|---|
SUM | 求和 |
AVG | 平均值 |
MAX | 最大值 |
MIN | 最小值 |
MEDIAN | 中位数 |
ANY_VALUE | 任取一个值 |
1、定义
这一类负责最常见的数值或单值汇总。
2、区别
| 函数 | 核心区别 |
|---|---|
SUM | 总和 |
AVG | 算术平均值 |
MAX / MIN | 最大 / 最小 |
MEDIAN | 排序后的中间位置 |
ANY_VALUE | 不关心具体哪一条,只随机/任选一个值 |
最容易混淆:
AVG是平均值,容易受极端值影响;MEDIAN是中位数,更偏向“中间水平”。
3、简单记忆
SUM加起来。AVG平均。MAX / MIN最大 / 最小。MEDIAN中间值。ANY_VALUE随便取一个。
4、案例
-- 结果:37775SELECTSUM(sal)FROMemp;-- 结果:2222.0588235294117SELECTAVG(sal)FROMemp;-- 结果:5000SELECTMAX(sal)FROMemp;-- 结果:800SELECTMIN(sal)FROMemp;-- 结果:1600.0SELECTMEDIAN(sal)FROMemp;-- 结果:返回任意一名员工姓名,例如 SMITHSELECTANY_VALUE(ename)FROMemp;四、计数 / 去重类
| 函数 | 功能 |
|---|---|
COUNT | 统计记录数 |
COUNT_IF | 统计条件为 TRUE 的记录数 |
APPROX_DISTINCT | 近似统计去重值数量 |
1、定义
COUNT:统计记录数量,也可使用DISTINCT去重后计数。COUNT_IF:直接统计满足布尔条件的记录数量。APPROX_DISTINCT:近似统计唯一值数量,以降低大数据量去重统计成本。
2、区别
| 对比 | 区别 |
|---|---|
COUNT(*) | 所有行 |
COUNT(col) | 只统计 col 非 NULL 的行 |
COUNT(DISTINCT col) | 精确去重计数 |
COUNT_IF(condition) | 条件计数 |
APPROX_DISTINCT(col) | 近似去重计数,官方说明存在约 5% 标准误差 |
3、简单记忆
COUNT= 数行。COUNT_IF= 满足条件才数。APPROX_DISTINCT= 大数据量下近似去重。
4、案例
-- 结果:17SELECTCOUNT(*)FROMemp;-- 结果:3SELECTCOUNT(DISTINCTdeptno)FROMemp;-- 结果:15SELECTCOUNT_IF(sal>1000)FROMemp;-- 结果:近似去重工资数量,例如 12SELECTAPPROX_DISTINCT(sal)FROMemp;五、极值关联取值类
| 函数 | 功能 |
|---|---|
ARG_MAX | 最大指标对应的另一列 |
MAX_BY | 最大指标对应的另一列 |
ARG_MIN | 最小指标对应的另一列 |
MIN_BY | 最小指标对应的另一列 |
1、定义
这类函数不是返回“最大值本身”,而是:
先找到某列最大或最小的那一行,再返回该行另一列的值。
2、区别
ARG_MAX和MAX_BY功能相同,主要区别是参数顺序相反:
| 函数 | 写法 |
|---|---|
ARG_MAX | ARG_MAX(比较列, 返回列) |
MAX_BY | MAX_BY(返回列, 比较列) |
ARG_MIN | ARG_MIN(比较列, 返回列) |
MIN_BY | MIN_BY(返回列, 比较列) |
如果最大值或最小值对应多行,可能从这些并列行中返回其中一行。
3、简单记忆
ARG_MAX(sal, ename)= 工资最大,返回姓名。MAX_BY(ename, sal)= 返回姓名,按工资最大找。ARG_MIN / MIN_BY同理。
4、案例
-- 结果:KINGSELECTARG_MAX(sal,ename)FROMemp;-- 结果:KINGSELECTMAX_BY(ename,sal)FROMemp;-- 结果:SMITHSELECTARG_MIN(sal,ename)FROMemp;-- 结果:SMITHSELECTMIN_BY(ename,sal)FROMemp;六、布尔 / 位聚合类
| 函数 | 功能 |
|---|---|
ANY | 是否至少一个 TRUE |
BOOL_AND | 所有布尔值做 AND |
BOOL_OR | 所有布尔值做 OR |
BITWISE_AND_AGG | 多个整数按位 AND |
BITWISE_OR_AGG | 多个整数按位 OR |
BITWISE_XOR_AGG | 多个整数按位 XOR |
1、定义
这一类把多行布尔值或整数位信息合并成一个结果。
2、区别
| 对比 | 区别 |
|---|---|
ANY | 至少有一个 TRUE 即 TRUE |
BOOL_OR | 也是布尔 OR,和ANY语义接近 |
BOOL_AND | 全部有效布尔值都为 TRUE 才为 TRUE |
BITWISE_AND_AGG | 按二进制位 AND |
BITWISE_OR_AGG | 按二进制位 OR |
BITWISE_XOR_AGG | 按二进制位 XOR |
布尔函数操作的是 TRUE / FALSE;位聚合操作的是整数的二进制位。
3、简单记忆
ANY / BOOL_OR= 有一个真就行。BOOL_AND= 全部都真。BITWISE_*= 对整数二进制位做聚合。
4、案例
-- 结果:trueSELECTANY(x)FROMVALUES(true),(false),(false)ASt(x);-- 结果:falseSELECTBOOL_AND(x)FROMVALUES(true),(false),(true)ASt(x);-- 结果:trueSELECTBOOL_OR(x)FROMVALUES(true),(false),(false)ASt(x);-- 结果:0,2 AND 1 = 0SELECTBITWISE_AND_AGG(v)FROMVALUES(2L),(1L)ASt(v);-- 结果:3,2 OR 1 = 3SELECTBITWISE_OR_AGG(v)FROMVALUES(2L),(1L)ASt(v);-- 结果:3,2 XOR 1 = 3SELECTBITWISE_XOR_AGG(v)FROMVALUES(2L),(1L)ASt(v);七、集合 / Map / 字符串类
| 函数 | 功能 |
|---|---|
COLLECT_LIST | 聚合成数组,保留重复 |
COLLECT_SET | 聚合成数组,去重 |
HISTOGRAM | 值 → 出现次数 |
MAP_AGG | 两列构造 Map |
MULTIMAP_AGG | 相同 Key 的多个 Value 聚合为数组 |
MAP_UNION | 合并多个 Map |
MAP_UNION_SUM | 合并 Map 并对相同 Key 求和 |
WM_CONCAT | 多行字符串拼成一个字符串 |
1、定义
这一类的核心是把多行记录聚合成:
- ARRAY
- MAP
- STRING
等复杂结果。
2、区别
| 对比 | 区别 |
|---|---|
COLLECT_LISTvsCOLLECT_SET | 保留重复 vs 去重 |
HISTOGRAM | 自动生成“值 → 次数” |
MAP_AGG | 一个 Key 对应一个 Value |
MULTIMAP_AGG | 一个 Key 对应多个 Value 数组 |
MAP_UNION | 多个 Map 合并,相同 Key 只保留一个值 |
MAP_UNION_SUM | 多个 Map 合并,相同 Key 数值相加 |
WM_CONCAT | 最终结果是字符串,不是 ARRAY |
3、简单记忆
LIST保重复。SET去重复。HISTOGRAM数次数。MAP_AGG= Key → Value。MULTIMAP_AGG= Key → 多个 Value。MAP_UNION_SUM= Map 合并后同 Key 求和。WM_CONCAT= 多行拼字符串。
4、案例
-- 结果:[1,2,2]SELECTCOLLECT_LIST(x)FROMVALUES(1),(2),(2)ASt(x);-- 结果:[1,2]SELECTCOLLECT_SET(x)FROMVALUES(1),(2),(2)ASt(x);-- 结果:{"hi":1,"apple":2,"pie":1}SELECTHISTOGRAM(x)FROMVALUES('hi'),(NULL),('apple'),('pie'),('apple')ASt(x);-- 结果:构造 Map,例如 {"1":"apple","2":"hi"}SELECTMAP_AGG(k,v)FROMVALUES(1L,'apple'),(2L,'hi')ASt(k,v);-- 结果:{"1":["apple","pie"],"2":["hi"]}SELECTMULTIMAP_AGG(k,v)FROMVALUES(1L,'apple'),(2L,'hi'),(1L,'pie')ASt(k,v);-- 结果:合并为一个 MapSELECTMAP_UNION(m)FROMVALUES(MAP(1L,'a',2L,'b')),(MAP(3L,'c'))ASt(m);-- 结果:{"a":4,"b":2}SELECTMAP_UNION_SUM(m)FROMVALUES(MAP('a',1L,'b',2L)),(MAP('a',3L))ASt(m);-- 结果:a,b,cSELECTWM_CONCAT(',',x)WITHINGROUP(ORDERBYx)FROMVALUES('b'),('a'),('c')ASt(x);八、统计分析类
| 函数 | 功能 |
|---|---|
CORR | 皮尔逊相关系数 |
COVAR_POP | 总体协方差 |
COVAR_SAMP | 样本协方差 |
STDDEV | 总体标准差 |
STDDEV_SAMP | 样本标准差 |
VARIANCE / VAR_POP | 总体方差 |
VAR_SAMP | 样本方差 |
1、定义
这一类用于衡量:
- 两列之间是否一起变化;
- 一列数据自身的离散程度。
2、区别
| 函数 | 关注点 |
|---|---|
CORR | 两列线性相关程度,结果通常在 -1 到 1 |
COVAR_POP / COVAR_SAMP | 两列共同变化程度 |
STDDEV / STDDEV_SAMP | 一列数据标准差 |
VARIANCE / VAR_POP / VAR_SAMP | 一列数据方差 |
总体与样本:
| 总体 | 样本 |
|---|---|
COVAR_POP | COVAR_SAMP |
STDDEV | STDDEV_SAMP |
VARIANCE / VAR_POP | VAR_SAMP |
3、简单记忆
CORR= 相关性。COVAR= 协方差。STDDEV= 标准差。VAR= 方差。_POP= Population,总体。_SAMP= Sample,样本。
4、案例
-- 结果:x 与 y 完全正相关时为 1.0SELECTCORR(x,y)FROMVALUES(1D,2D),(2D,4D),(3D,6D)ASt(x,y);-- 结果:计算总体协方差SELECTCOVAR_POP(x,y)FROMVALUES(1D,2D),(2D,4D),(3D,6D)ASt(x,y);-- 结果:计算样本协方差SELECTCOVAR_SAMP(x,y)FROMVALUES(1D,2D),(2D,4D),(3D,6D)ASt(x,y);-- 结果:计算总体标准差SELECTSTDDEV(x)FROMVALUES(1D),(2D),(3D)ASt(x);-- 结果:计算样本标准差SELECTSTDDEV_SAMP(x)FROMVALUES(1D),(2D),(3D)ASt(x);-- 结果:计算总体方差SELECTVARIANCE(x)FROMVALUES(1D),(2D),(3D)ASt(x);-- 结果:与 VARIANCE 等价,计算总体方差SELECTVAR_POP(x)FROMVALUES(1D),(2D),(3D)ASt(x);-- 结果:计算样本方差SELECTVAR_SAMP(x)FROMVALUES(1D),(2D),(3D)ASt(x);九、百分位 / 分布类
| 函数 | 功能 |
|---|---|
PERCENTILE | 精确百分位,适合较小数据量 |
PERCENTILE_APPROX | 近似百分位,适合大数据量 |
PERCENTILE_CONT | 连续型精确百分位 |
PERCENTILE_DISC | 离散型百分位 |
NUMERIC_HISTOGRAM | 近似数值直方图 |
1、定义
这一类用于回答:
- P50、P90、P95 是多少;
- 数据主要分布在哪些区间。
2、区别
| 对比 | 区别 |
|---|---|
PERCENTILE | 精确计算,适合较小数据量 |
PERCENTILE_APPROX | 近似计算,适合大数据量 |
PERCENTILE_CONT | 精确连续百分位,可以插值 |
PERCENTILE_DISC | 离散百分位,只返回实际存在的值 |
NUMERIC_HISTOGRAM | 不直接返回一个百分位,而是近似描述整个分布 |
PERCENTILE与PERCENTILE_CONT都属于精确百分位,但接口和支持类型不同;日常更重要的是区分精确与近似、连续与离散。
3、简单记忆
PERCENTILE= 精确百分位。APPROX= 近似,适合大数据。CONT= Continuous,可以插值。DISC= Discrete,只拿实际值。HISTOGRAM= 看整体分布。
4、案例
-- 结果:emp 示例数据的 30% 百分位为 1290.0SELECTPERCENTILE(sal,0.3)FROMemp;-- 结果:emp 示例数据的近似 30% 百分位约为 1252.5SELECTPERCENTILE_APPROX(sal,0.3)FROMemp;-- 结果:1.5SELECTPERCENTILE_CONT(x,0.5)FROMVALUES(0D),(3D),(1D),(2D)ASt(x);-- 结果:bSELECTPERCENTILE_DISC(x,0.5)FROMVALUES('c'),('b'),('a')ASt(x);-- 结果:返回 Map,Key 为近似区间点,Value 为近似频数SELECTNUMERIC_HISTOGRAM(3,x)FROMVALUES(1D),(2D),(3D),(4D),(5D)ASt(x);十、最容易混淆的函数对比
| 函数组合 | 最核心区别 |
|---|---|
COUNT(*)vsCOUNT(col) | 所有行 vs 只统计非 NULL |
COUNT(DISTINCT)vsAPPROX_DISTINCT | 精确去重 vs 近似去重 |
COUNT_IFvsCOUNT + FILTER | 直接条件计数 vs 聚合函数过滤表达式 |
AVGvsMEDIAN | 平均值 vs 中位数 |
MAXvsARG_MAX | 返回最大值本身 vs 返回最大值所在行的另一列 |
ARG_MAXvsMAX_BY | 功能相同,参数顺序相反 |
ARG_MINvsMIN_BY | 功能相同,参数顺序相反 |
ANYvsBOOL_OR | 都表示至少有一个 TRUE,语义接近 |
BOOL_ANDvsBOOL_OR | 全部为真 vs 至少一个为真 |
COLLECT_LISTvsCOLLECT_SET | 保留重复 vs 去重 |
MAP_AGGvsMULTIMAP_AGG | Key→单值 vs Key→数组 |
MAP_UNIONvsMAP_UNION_SUM | 合并并任选冲突值 vs 合并并对同 Key 数值求和 |
HISTOGRAMvsNUMERIC_HISTOGRAM | 精确统计离散值次数 vs 近似描述连续数值分布 |
CORRvsCOVAR_POP | 标准化相关程度 vs 原始协方差 |
STDDEVvsSTDDEV_SAMP | 总体标准差 vs 样本标准差 |
VAR_POPvsVAR_SAMP | 总体方差 vs 样本方差 |
PERCENTILEvsPERCENTILE_APPROX | 精确、小数据 vs 近似、大数据 |
PERCENTILE_CONTvsPERCENTILE_DISC | 可插值 vs 返回实际值 |
WM_CONCATvsCOLLECT_LIST | 返回字符串 vs 返回数组 |
十一、参考资料
阿里云 MaxCompute 官方文档:
https://help.aliyun.com/zh/maxcompute/aggregate-functions