在 Presto SQL 中如何创建数组值及其计数的映射

In Presto SQL how to create a map of array values and its count

如果我有如下所示的 table,我如何获取第 2 列中数组中唯一值计数的映射?

ID Column1 Column2
1 10 [a, a, b, c]
2 12 [a, a, a]

我想要如下内容:

ID Column1 Column2
1 10 {a: 2, b: 1, c: 1}
2 12 {a: 3}

我尝试为此使用 Presto 的 [histogram][1]。但它是一个聚合函数,需要group by。我需要为每一行使用 histogram 而不是整个 table.

例如,

SELECT distinct ID,
       histogram(column1) AS column1,
       column2
FROM table

returns '"ID"' must be an aggregate expression or appear in GROUP BY clause

您可以使用 unnest 将数组扩展为一列,然后在这个新列上使用 histogram

WITH dataset AS (
    SELECT *
    FROM (
             VALUES (1, 10, ARRAY['a', 'a', 'b', 'c']),
                    (2, 12, ARRAY['a', 'a', 'a'])
         ) AS t (ID, Column1, Column2))

SELECT
    ID, Column1, histogram(Col2) as Column2
FROM
    dataset
CROSS JOIN unnest(Column2) as t(Col2)
GROUP BY ID, Column1

结果:

ID Column1 Column2
1 10 {a=2, b=1, c=1}
2 12 {a=3}