Поиск наиболее распространенных элементов столбца массивов в Presto - PullRequest
0 голосов
/ 18 октября 2019

Я хотел бы найти наиболее распространенные элементы в столбце массивов в presto.

Например ...

    col1
    [A,B,C]
    [A,B]
    [A,D]

с выводом ...

    col1 - col2 
    A - 3
    B - 2
    C - 1
    D - 1    

Я пробовал использовать flatten и unnest. Я могу получить его в один массив, используя

    select flatten(array_agg(col1))
    from tablename;

, но тогда я не уверен, как группировать и считать по отдельным элементам. Я также изо всех сил пытаюсь заставить это работать на всех моих данных из-за большого объема требуемой памяти. Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Вы можете использовать unnest () , чтобы сгладить массив, а затем сгруппировать по , чтобы сгруппировать уникальные значения.

Запрос для создания набора данных для вашегокейс. Вы можете заменить эту часть командой select в последнем запросе:

with dataset AS (
  SELECT  ARRAY[
    ARRAY['A','B','C'],
    ARRAY['A','B'],
    ARRAY['A','D']
    ] AS data
   )
   select dt from dataset
   CROSS JOIN UNNEST(data) AS t(dt)

O / P:

------
dt
------
[A,B,C]
------
[A,B]
------
[A,D]

Теперь в последнем запросе мы сначалавыровняйте эти данные, чтобы удалить все значения из всех строк, а затем сгруппируйте их, чтобы получить уникальные значения и их количество.

ЗАКЛЮЧИТЕЛЬНЫЙ ЗАПРОС:

with da AS( 
 with dataset AS (
  SELECT  ARRAY[
    ARRAY['A','B','C'],
    ARRAY['A','B'],
    ARRAY['A','D']
    ] AS data
   )
   select dt from dataset
   CROSS JOIN UNNEST(data) AS t(dt)
  )
  select daVal,count(*) from da
  CROSS JOIN UNNEST(dt) AS t(daVal)
  GROUP BY daVal
0 голосов
/ 18 октября 2019

Вы можете unnest() и агрегировать:

select u.col, count(*)
from t cross join
     unnest(col1) u(col)
group by u.col;
...