通过 Snowflake 中的不同方式展平并聚合两列数组

Nel*_*son 5 snowflake-cloud-data-platform

表结构是

+------------+---------+
|  Animals   |  Herbs  |
+------------+---------+
| [Cat, Dog] | [Basil] |
| [Dog, Lion]| []      |
+------------+---------+
Run Code Online (Sandbox Code Playgroud)

所需的输出(不关心此列表的排序):

unique_things
+------------+
[Cat, Dog, Lion, Basil]
Run Code Online (Sandbox Code Playgroud)

第一次尝试是这样的

SELECT ARRAY_CAT(ARRAY_AGG(DISTINCT(animals)), ARRAY_AGG(herbs))
Run Code Online (Sandbox Code Playgroud)

但这会产生

[[Cat, Dog], [Dog, Lion], [Basil], []]
Run Code Online (Sandbox Code Playgroud)

由于不同的组件在每个数组上进行操作,因此不会查看所有数组中的不同组件

Luk*_*zda 4

更新

不使用 FLATTEN 也可以使用ARRAY_UNION_AGG

返回一个 ARRAY,其中包含列中输入 ARRAY 的不同值的并集。

对于样本数据:

CREATE OR REPLACE TABLE t AS
SELECT ['Cat', 'Dog'] AS Animals, ['Basil'] AS Herbs
UNION SELECT ['Dog', 'Lion'], [];
Run Code Online (Sandbox Code Playgroud)

询问:

SELECT ARRAY_UNION_AGG(ARRAY_CAT(Animals, Herbs)) AS Result
FROM t
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT ARRAY_UNION_AGG(Animals) AS Result
FROM (SELECT Animals FROM t 
      UNION ALL
      SELECT Herbs FROM t);
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


您可以展平组合数组,然后聚合回来:

SELECT ARRAY_AGG(DISTINCT F."VALUE") AS unique_things
FROM tab, TABLE(FLATTEN(ARRAY_CAT(tab.Animals, tab.Herbs))) f
Run Code Online (Sandbox Code Playgroud)