在Presto中查找数组列的最常见元素

时间:2019-10-18 18:13:18

标签: sql presto

我想在presto的一列数组中找到最常见的元素。

例如...

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

输出为...

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

我已经尝试过使用flatten和nest。我可以使用

将其放入单个数组
    select flatten(array_agg(col1))
    from tablename;

但是我不确定如何根据不同的元素进行分组和计数。由于所需的大量内存,我也很难使它在我的所有数据上运行。 感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以unnest()进行汇总:

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

答案 1 :(得分:0)

您可以使用 unnest()展平Array,然后分组依据对唯一值进行分组。

用于为您的案例生成数据集的查询。您可以在最终查询中用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