数仓 SQL 函数对照

首页 / 聚合

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
-- 按页面名排序,不是按访问时间
SELECT user_id, SORT_ARRAY(COLLECT_LIST(page)) FROM visits GROUP BY user_id;
StarRocks
-- 按访问时间排序
SELECT user_id, ARRAY_AGG(page ORDER BY visit_time) FROM visits GROUP BY user_id;
Spark SQL
SELECT user_id, collect_list(page) FROM visits GROUP BY user_id;

同类函数

最后核对日期: