SQL 方言通

首页 / 数组和 Map

ARRAY_DISTINCT 数组去重

ARRAY_DISTINCT 去掉数组中的重复元素。除 Hive 外都同名可用,差异在元素顺序和 NULL:MaxCompute、Doris 和 Flink 保持原顺序,StarRocks 文档说明返回顺序可能变化;多数引擎会保留一个 NULL。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持ARRAY_DISTINCT(a)保持原有顺序;NULL 参与去重,结果中保留一个 NULL;空数组返回空数组。官方文档
Hologres支持ARRAY_DISTINCT(array)Hologres V1.3.19 起支持,暂不支持对常量数组调用。官方文档
StarRocks支持array_distinct(array)返回数组中元素的顺序可能与原数组不同。官方文档
Doris支持ARRAY_DISTINCT(arr)2.0.0 起提供,保持原有顺序,只保留每个元素第一次出现的位置。数组为 NULL 时返回 NULL。官方文档已实测 4.1.5
Hive需改写collect_set(x)内置函数文档中没有 array_distinct。对已经展开的列可以用 collect_set 重新聚合去重,顺序不保证。官方文档已实测 4.2.1
Spark SQL支持array_distinct(array)Spark 2.4.0 起提供,文档示例中保留一个 NULL:[1,2,3,null]。官方文档
Flink SQL支持ARRAY_DISTINCT(haystack)保持元素顺序,数组为 NULL 时返回 NULL。官方文档已实测 2.3.0

迁移注意事项

示例

去掉标签数组中的重复项

MaxCompute
SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;
Hologres
SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;
StarRocks
SELECT user_id, array_distinct(tags) AS tags FROM user_tags;
Doris
SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;
Spark SQL
SELECT user_id, array_distinct(tags) AS tags FROM user_tags;
Flink SQL
SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;

同类函数

数组和 Map:全部引擎写法对照

核对日期: · 提交勘误