SQL 方言通

首页 / 聚合

聚合函数对照

聚合函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 7 个函数。其中 7 个函数在部分引擎中需要改写或没有对应函数。

目录:any_value · approx_count_distinct · collect_list · collect_set · max_by · percentile_approx · wm_concat

ANY_VALUE 取组内任意值

ANY_VALUE 从每组中任取一个值,常用于 GROUP BY 时带出不参与分组、但组内都一样的列。结果不确定,各引擎对 NULL 的处理也不同。Hologres、Hive 和 Flink 没有这个函数。

引擎支持写法
MaxCompute支持ANY_VALUE(colname)
Hologres需改写MAX(col)
StarRocks支持ANY_VALUE(expr)
Doris支持ANY_VALUE(expr)
Hive需改写max(col)
Spark SQL支持any_value(expr[, isIgnoreNull])
Flink SQL需改写FIRST_VALUE(expression)

APPROX_COUNT_DISTINCT 近似去重计数

APPROX_COUNT_DISTINCT 用 HyperLogLog 等算法估算去重个数,比 COUNT(DISTINCT) 省内存。Hologres、StarRocks、Doris 和 Spark 同名可用,MaxCompute 叫 APPROX_DISTINCT,Hive 和 Flink 没有内置的近似去重函数,只能用精确的 COUNT(DISTINCT)。

引擎支持写法
MaxCompute别名APPROX_DISTINCT(colname)
Hologres支持APPROX_COUNT_DISTINCT(column)
StarRocks支持APPROX_COUNT_DISTINCT(expr)
Doris支持APPROX_COUNT_DISTINCT(expr)
Hive需改写COUNT(DISTINCT col)
Spark SQL支持approx_count_distinct(expr[, relativeSD])
Flink SQL需改写COUNT(DISTINCT expr)

COLLECT_LIST 聚合为数组

COLLECT_LIST 把一组值按原样聚合成数组,保留重复值。MaxCompute、Doris、Hive 和 Spark 同名可用,其他引擎改写为 ARRAY_AGG。各引擎都不保证元素顺序,StarRocks 3.0 起可以在 ARRAY_AGG 中写 ORDER BY。

引擎支持写法
MaxCompute支持COLLECT_LIST(colname)
Hologres需改写ARRAY_AGG(expression)
StarRocks需改写ARRAY_AGG(col [ORDER BY ...])
Doris支持COLLECT_LIST(expr[, max_size])
Hive支持collect_list(col)
Spark SQL支持collect_list(expr)
Flink SQL需改写ARRAY_AGG(expression)

COLLECT_SET 去重聚合为数组

COLLECT_SET 把一组值去重后聚合成数组。MaxCompute、Doris、Hive 和 Spark 同名可用,Hologres、StarRocks 和 Flink 要改写为 ARRAY_AGG(DISTINCT ...)。各引擎都不保证数组元素的顺序。

引擎支持写法
MaxCompute支持COLLECT_SET(colname)
Hologres需改写ARRAY_AGG(DISTINCT expression)
StarRocks需改写ARRAY_AGG(DISTINCT col)
Doris支持COLLECT_SET(expr[, max_size])
Hive支持collect_set(col)
Spark SQL支持collect_set(expr)
Flink SQL需改写ARRAY_AGG(DISTINCT expression)

MAX_BY 取最大值对应的列

MAX_BY(x, y) 返回 y 最大的那一行的 x,例如“每个用户最近一次下单的门店”。MaxCompute、Hologres、StarRocks、Doris 和 Spark 都支持;Hive 和 Flink 没有,要用 ROW_NUMBER 窗口函数改写。y 相同时返回哪一行不确定。

引擎支持写法
MaxCompute支持MAX_BY(valueToReturn, valueToMaximize)
Hologres支持MAX_BY(x, y)
StarRocks支持max_by(x, y)
Doris支持MAX_BY(expr1, expr2)
Hive需改写ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1
Spark SQL支持max_by(x, y[, k])
Flink SQL需改写ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1

PERCENTILE_APPROX 近似分位数

PERCENTILE_APPROX 计算近似分位数,常用于 P50、P99 这类指标。MaxCompute、StarRocks、Doris、Hive 和 Spark 同名可用,但第三个参数的含义和取值范围不同。Hologres 要用 APPROX_PERCENTILE ... WITHIN GROUP 改写,Flink 较新版本只有精确的 PERCENTILE。

引擎支持写法
MaxCompute支持PERCENTILE_APPROX(col[, weight], p[, B])
Hologres需改写APPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)
StarRocks支持PERCENTILE_APPROX(expr, p[, compression])
Doris支持PERCENTILE_APPROX(col, p[, compression])
Hive支持percentile_approx(col, p[, B])
Spark SQL支持percentile_approx(col, percentage[, accuracy])
Flink SQL需改写PERCENTILE(expr, percentage[, frequency])

WM_CONCAT 分组拼接字符串

WM_CONCAT 是 MaxCompute 的分组字符串拼接函数,分隔符写在前面。迁到其他引擎时要换函数名,并注意分隔符的位置:Hologres 用 STRING_AGG,StarRocks 和 Doris 用 GROUP_CONCAT,Flink 用 LISTAGG。

引擎支持写法
MaxCompute支持WM_CONCAT(separator, colname)
Hologres需改写STRING_AGG(expression, delimiter)
StarRocks需改写GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])
Doris需改写GROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...])
Hive需改写concat_ws(',', collect_list(col))
Spark SQL需改写string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...)
Flink SQL需改写LISTAGG(expression[, separator])

其他分类

最近核对: