Как сгладить набор ARRAY_AGGS в Snowflake SELECT

Я пытаюсь сделать SELECT для нескольких объединенных таблиц с колонками VARIANT. Основная запись возвращается как DATA, а вся вспомогательная информация вокруг нее состоит из поддерживающих соединенных таблиц, возвращаемых как INCLUDED.

Я использую ARRAY_CONSTRUCT_COMPACT для поддерживающих записей VARIANT И ARRAY_AGG (DISTINCT [запись]) для их агрегирования и исключения дубликатов.

Проблема в том, что ARRAY_AGG создает несколько записей в одной из моих объединенных таблиц (ENTITIES). Когда они создаются с использованием ARRAY_CONSTRUCT_COMPACT (), результатом является массив массивов, который мне нужно объединить в единый массив объектов.

Я пробовал использовать комбинации ARRAY_COMPACT и ARRAY_CAT с вложенными ARRAY_AGGS, но с оговоркой, что ARRAY_CAT принимает только 2 аргумента. В приведенном ниже коде я ближе всего к тому, что мне нужно, но я не могу понять, как сгладить этот последний массив как ВКЛЮЧЕННЫЙ.


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 в настоящее время: [[{}], [{},{}], [{}]]

Который мне нужно сплющить: [{}, {}, {}, {}]

Любая помощь будет принята с благодарностью!


person Curtis Blanchette    schedule 19.07.2019    source источник


Ответы (1)


Вы можете использовать javascript в функциях, которые сделают это красивым и аккуратным:

CREATE OR REPLACE FUNCTION ARRAY_CAT_ALL( source Array )
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
    return [].concat.apply([], SOURCE);
$$;

Затем вы можете обернуть результат ARRAY_CONSTRUCT_COMPACT этой функцией, которая сведет массив массивов в единый массив.

person Bradley    schedule 19.07.2019
comment
Спасибо @Bradley. Это было именно то, что мне было нужно. : +1: - person Curtis Blanchette; 19.07.2019