收集集合函数:COLLECT_SET

collect_set([DISTINCT] expr [, limit]) [FILTER (WHERE condition)]

功能描述

collect_set 函数用于从输入的一组数据中收集并返回一个不重复的元素集合。该函数可以确保返回的数组中不包含重复的元素,从而使结果更加简洁明了。当指定 DISTINCT 关键字时,函数会对结果进行去重处理,但请注意,即使不指定 DISTINCTcollect_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)对结果进行排序处理。

联系我们
预约咨询
微信咨询
电话咨询