☰
MaxCompute中聚合函数
2026/9/28 20:47:50 网站建设 项目流程

文章目录

  • 一、分类总览
    • 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_MAXARG_MAX(比较列, 返回列)
MAX_BYMAX_BY(返回列, 比较列)
ARG_MINARG_MIN(比较列, 返回列)
MIN_BYMIN_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_POPCOVAR_SAMP
STDDEVSTDDEV_SAMP
VARIANCE / VAR_POPVAR_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_AGGKey→单值 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询