首页 / 聚合
ANY_VALUE 取组内任意值
ANY_VALUE 从每组中任取一个值,常用于 GROUP BY 时带出不参与分组、但组内都一样的列。结果不确定,各引擎对 NULL 的处理也不同。Hologres、Hive 和 Flink 没有这个函数。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | ANY_VALUE(colname) |
值为 NULL 的行不参与计算,不保证返回哪一行。 | 官方文档 |
| Hologres | 需改写 | MAX(col) |
通用聚合函数中没有 ANY_VALUE。组内值都相同时,可以用 MAX 或 MIN 代替。 | 官方文档 |
| StarRocks | 支持 | ANY_VALUE(expr) |
返回值不确定。3.2 起支持 ARRAY、MAP 和 STRUCT 类型。 | 官方文档 |
| Doris | 支持 | ANY_VALUE(expr) |
别名 ANY。组内有非 NULL 值时返回其中一个,全部为 NULL 时返回 NULL。 | 官方文档 |
| Hive | 需改写 | max(col) |
函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。 | 官方文档 |
| Spark SQL | 支持 | any_value(expr[, isIgnoreNull]) |
Spark 3.4.0 起提供,结果不确定。isIgnoreNull 为 true 时只返回非 NULL 值,默认可能返回 NULL。 | 官方文档 |
| Flink SQL | 需改写 | FIRST_VALUE(expression) |
内置函数中没有 ANY_VALUE,可以用聚合函数 FIRST_VALUE 代替。 | 官方文档 |
迁移注意事项
- NULL 的处理不同:MaxCompute 和 Doris 会优先返回非 NULL 值,Spark 默认可能返回 NULL,需要传 true 才会跳过 NULL。
- 只在组内值都相同的列上使用。如果组内值不同,每次运行可能取到不同的值,结果无法复现。
示例
按门店汇总时带出门店名称
SELECT store_id, ANY_VALUE(store_name), SUM(amount) FROM sales GROUP BY store_id;SELECT store_id, MAX(store_name), SUM(amount) FROM sales GROUP BY store_id;SELECT store_id, any_value(store_name, true), sum(amount) FROM sales GROUP BY store_id;