Как объединить массивы в Snow sql GroupBy и сохранить только определенные значения? - PullRequest
2 голосов
/ 17 марта 2020

Я пытаюсь выполнить запрос, в котором перечислены все отдельные рынки, которые пользователь отправил для моего набора данных. Значения в столбце Markets уже представлены в формате массива. Когда я запускаю запрос, приведенный ниже, я получаю массив массивов, и некоторые рынки могут быть перечислены несколько раз, потому что в отдельном предложении рассматриваются уникальные массивы, а не значения в массивах. Например, если я пытаюсь сгруппировать ['New York'] и ['New York', 'Chica go'], моя цель - получить ['New York', 'Chica go'] в качестве моего результат, но в настоящее время я получаю [['' New York '], [' New York ',' Chica go ']]. Ценю любую помощь.

SELECT 
  s.submitter_id,
  ARRAY_AGG(DISTINCT s.markets)
FROM 
  analytics.submissions AS s
GROUP BY 1

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Простой способ - сначала сплющить массив

WITH data AS (
 SELECT submitter_id, split(markets,';') AS markets 
 FROM VALUES (1,'new york'), (1,'new york;chicargo') s(submitter_id, markets)
)
SELECT 
  a.submitter_id,
  ARRAY_AGG(DISTINCT a.market)
FROM (
    SELECT s.submitter_id
        ,f.value AS market
    FROM data AS s,
    LATERAL FLATTEN(input => s.markets) f
) AS a
GROUP BY 1;
0 голосов
/ 18 марта 2020

Вариант с использованием javascript UDF:

WITH data AS (
 SELECT submitter_id, split(markets,';') AS markets 
 FROM VALUES (1,'new york'), (1,'new york;chicargo') s(submitter_id, markets)
)
SELECT 
  submitter_id,
  array_flat_distinct(ARRAY_AGG(distinct markets))
from data
group by 1;

Где UDF определяется как:

create or replace function array_flat_distinct("a" array)
returns array
language javascript
as
$$
    return [...new Set(a.reduce((b,c)=>[...b,...c]))]
$$
;
...