如何在 Snowflake SELECT 中压平一组 ARRAY_AGGS
How to FLATTEN a set of ARRAY_AGGS in Snowflake SELECT
我正在尝试对多个连接的 VARIANT 列表创建 SELECT。主记录作为 DATA 返回,它周围的所有支持信息均由作为 INCLUDED 返回的支持连接表组成。
我在支持的 VARIANT 记录上使用 ARRAY_CONSTRUCT_COMPACT 和 ARRAY_AGG(DISTINCT [record]) 来聚合它们并删除重复项。
问题是 ARRAY_AGG 在我的一个连接表 (ENTITIES) 上生成了多条记录。当使用 ARRAY_CONSTRUCT_COMPACT() 构造它们时,结果是一个数组数组,我需要将其展平为单个对象数组。
我试过将 ARRAY_COMPACT 和 ARRAY_CAT 与嵌套的 ARRAY_AGGS 组合使用,需要注意的是 ARRAY_CAT 只接受 2 个参数。下面的代码让我最接近我需要的,但我似乎无法弄清楚如何将最终数组展平为 INCLUDED。
SELECT
a1.appointment data,
ARRAY_CONSTRUCT_COMPACT(
ARRAY_AGG(DISTINCT c1.call),
ARRAY_AGG(DISTINCT e1.entity),
ARRAY_AGG(DISTINCT a2.address)
) included
FROM APPOINTMENTS a1
INNER JOIN CALLS c1 ON c1.call:id = a1.appointment:callId
INNER JOIN ENTITIES e1 ON e1.entity:id IN (
a1.appointment:relationships.agent,
a1.appointment:relationships.consultant,
a1.appointment:relationships.contact
)
INNER JOIN ADDRESSES a2 ON a2.address:id = a1.appointment:relationships:office
WHERE a1.appointment:id = 'some_appointment_id'
GROUP BY a1.appointment;
我的 INCLUDED 列的输出当前是:
[[{}], [{},{}], [{}]]
我需要将其展平为:
[{}, {}, {}, {}]
如有任何帮助,我们将不胜感激!
您可以在函数中使用 javascript 使它变得漂亮整洁:
CREATE OR REPLACE FUNCTION ARRAY_CAT_ALL( source Array )
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
return [].concat.apply([], SOURCE);
$$;
然后您可以使用此函数包装您的 ARRAY_CONSTRUCT_COMPACT 结果,这会将数组的数组展平为单个数组。
进一步增强了 Bradley 的答案以处理数组中的重复项,这是我发现它时的特定用例!
CREATE OR REPLACE FUNCTION ARRAY_CAT_ALL( source Array )
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
const temp_array = [].concat.apply([], SOURCE)
const unique = new Set(temp_array);
return [...unique];
$$;
我正在尝试对多个连接的 VARIANT 列表创建 SELECT。主记录作为 DATA 返回,它周围的所有支持信息均由作为 INCLUDED 返回的支持连接表组成。
我在支持的 VARIANT 记录上使用 ARRAY_CONSTRUCT_COMPACT 和 ARRAY_AGG(DISTINCT [record]) 来聚合它们并删除重复项。
问题是 ARRAY_AGG 在我的一个连接表 (ENTITIES) 上生成了多条记录。当使用 ARRAY_CONSTRUCT_COMPACT() 构造它们时,结果是一个数组数组,我需要将其展平为单个对象数组。
我试过将 ARRAY_COMPACT 和 ARRAY_CAT 与嵌套的 ARRAY_AGGS 组合使用,需要注意的是 ARRAY_CAT 只接受 2 个参数。下面的代码让我最接近我需要的,但我似乎无法弄清楚如何将最终数组展平为 INCLUDED。
SELECT
a1.appointment data,
ARRAY_CONSTRUCT_COMPACT(
ARRAY_AGG(DISTINCT c1.call),
ARRAY_AGG(DISTINCT e1.entity),
ARRAY_AGG(DISTINCT a2.address)
) included
FROM APPOINTMENTS a1
INNER JOIN CALLS c1 ON c1.call:id = a1.appointment:callId
INNER JOIN ENTITIES e1 ON e1.entity:id IN (
a1.appointment:relationships.agent,
a1.appointment:relationships.consultant,
a1.appointment:relationships.contact
)
INNER JOIN ADDRESSES a2 ON a2.address:id = a1.appointment:relationships:office
WHERE a1.appointment:id = 'some_appointment_id'
GROUP BY a1.appointment;
我的 INCLUDED 列的输出当前是:
[[{}], [{},{}], [{}]]
我需要将其展平为:
[{}, {}, {}, {}]
如有任何帮助,我们将不胜感激!
您可以在函数中使用 javascript 使它变得漂亮整洁:
CREATE OR REPLACE FUNCTION ARRAY_CAT_ALL( source Array )
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
return [].concat.apply([], SOURCE);
$$;
然后您可以使用此函数包装您的 ARRAY_CONSTRUCT_COMPACT 结果,这会将数组的数组展平为单个数组。
进一步增强了 Bradley 的答案以处理数组中的重复项,这是我发现它时的特定用例!
CREATE OR REPLACE FUNCTION ARRAY_CAT_ALL( source Array )
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
const temp_array = [].concat.apply([], SOURCE)
const unique = new Set(temp_array);
return [...unique];
$$;