收集集合函数:COLLECT_SET
collect_set([DISTINCT] expr [, limit]) [FILTER (WHERE condition)]
功能描述
collect_set 函数用于从输入的一组数据中收集并返回一个不重复的元素集合。该函数可以确保返回的数组中不包含重复的元素,从而使结果更加简洁明了。当指定 DISTINCT 关键字时,函数会对结果进行去重处理,但请注意,即使不指定 DISTINCT,collect_set 函数也会进行去重操作,因此 DISTINCT 关键字在此场景下不影响结果。
参数说明
expr:可以是任意数据类型的表达式。
limit:可选参数,整数类型,表示最多收集的元素个数。如果不指定,则收集所有元素。
返回结果
- 返回一个数组(
ARRAY),数组中的元素类型与输入参数类型相同。
- 即使使用
DISTINCT 关键字,也不会影响去重结果。
- 如果指定了
limit 参数,则返回的数组最多包含 limit 个元素。
- 返回的数组元素顺序不保证与输入顺序相同。
- 输入的
NULL 值不会包含在结果数组中。
使用示例
示例 1:基本使用
SELECT collect_set(col) FROM VALUES (1), (2), (1), (NULL) AS tab(col);
+------------------+
| collect_set(col) |
+------------------+
| [2,1] |
+------------------+
示例 2:去重操作
SELECT collect_set(DISTINCT col)
FROM VALUES ("a"), ("b"), (NULL), ("c"), ("a") AS tab(col);
+---------------------------+
| collect_set(DISTINCT col) |
+---------------------------+
| ["c","b","a"] |
+---------------------------+
示例 3:使用 FILTER 子句条件性地收集集合
SELECT collect_set(col) FILTER (WHERE col > 1) FROM VALUES (1), (2), (3), (2), (4) AS tab(col);
+-------------------------------------------+
| collect_set(col) FILTER (WHERE (col > 1)) |
+-------------------------------------------+
| [4,3,2] |
+-------------------------------------------+
示例 4:结合 FILTER 子句和 DISTINCT 收集条件集合
SELECT collect_set(DISTINCT col) FILTER (WHERE col != 'a') FROM VALUES ('a'), ('b'), ('c'), ('b') AS tab(col);
+----------------------------------------------------------+
| collect_set(DISTINCT col) FILTER (WHERE (NOT (col = 'a')))|
+----------------------------------------------------------+
| ["c","b"] |
+----------------------------------------------------------+
示例 5:使用 limit 参数限制返回的元素个数
SELECT collect_set(col, 2) FROM VALUES (1), (2), (3), (4), (2) AS tab(col);
+---------------------+
| collect_set(col, 2) |
+---------------------+
| [2,1] |
+---------------------+
注意事项
- 当处理大量数据时,请注意
collect_set 函数可能会消耗较多的内存资源。
- 由于返回的数组元素顺序不保证与输入顺序相同,若需要排序,请使用其他函数(如
ARRAY_SORT)对结果进行排序处理。