首页 / 聚合
COLLECT_LIST 聚合为数组
COLLECT_LIST 把一组值按原样聚合成数组,保留重复值。MaxCompute、Doris、Hive 和 Spark 同名可用,其他引擎改写为 ARRAY_AGG。各引擎都不保证元素顺序,StarRocks 3.0 起可以在 ARRAY_AGG 中写 ORDER BY。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | COLLECT_LIST(colname) |
值为 NULL 的行不参与计算,结果不保证顺序。官方建议拼接字符串时改用 WM_CONCAT。 | 官方文档 |
| Hologres | 需改写 | ARRAY_AGG(expression) |
没有 COLLECT_LIST,用 ARRAY_AGG。 | 官方文档 |
| StarRocks | 需改写 | ARRAY_AGG(col [ORDER BY ...]) |
在 StarRocks 文档中搜索不到 COLLECT_LIST。ARRAY_AGG 会保留 NULL,3.0 起支持 ORDER BY 指定元素顺序。 | 官方文档 |
| Doris | 支持 | COLLECT_LIST(expr[, max_size]) |
别名 GROUP_ARRAY,会丢弃 NULL,max_size 限制数组长度。 | 官方文档 |
| Hive | 支持 | collect_list(col) |
Hive 0.13.0 起提供,保留重复值。 | 官方文档 |
| Spark SQL | 支持 | collect_list(expr) |
Spark 2.0.0 起提供,结果顺序不确定。3.3.0 起另有同义的 array_agg。 | 官方文档 |
| Flink SQL | 需改写 | ARRAY_AGG(expression) |
没有输入行时返回 NULL,可以用 RESPECT NULLS 或 IGNORE NULLS 控制是否保留 NULL。 | 官方文档 |
迁移注意事项
- 不要依赖数组元素的顺序。MaxCompute 文档建议用 SORT_ARRAY 排序;StarRocks 可以直接写 ARRAY_AGG(x ORDER BY y)。
- 用 COLLECT_LIST(x)[0] 取每组的一个值时,MaxCompute 官方建议改用 ANY_VALUE,性能更好,语义也更清楚。
- StarRocks 的 ARRAY_AGG 保留 NULL,MaxCompute 和 Doris 的 COLLECT_LIST 丢弃 NULL,数组长度可能不一致。
示例
收集每个用户访问过的页面
-- 按页面名排序,不是按访问时间
SELECT user_id, SORT_ARRAY(COLLECT_LIST(page)) FROM visits GROUP BY user_id;-- 按访问时间排序
SELECT user_id, ARRAY_AGG(page ORDER BY visit_time) FROM visits GROUP BY user_id;SELECT user_id, collect_list(page) FROM visits GROUP BY user_id;