Добавьте две карты в Presto - PullRequest
       11

Добавьте две карты в Presto

0 голосов
/ 06 декабря 2018

Мои данные, как указано ниже

customer_id   usage_month  usage_by_product         usage
1             June         {"A":50, "B":50}         100
1             July         {"A":50, "B":10, "C":20} 80
1             Aug          {"A":50, "D":500}        550
1             Sep          {"C" :30}                30

Я хочу написать запрос, который агрегирует общее использование за полный год

customer_id   usage_by_product    usage
 1            {"A": 150, "B":60   760
               "C": 50, "D":500}

Возможно ли сделать этот видагрегация на картах в Афинах (Престо)?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете разбить вашу карту на отдельные пары ключ / значение с помощью map_entries + UNNEST.Затем необходимо суммировать и агрегировать значения обратно в map.

Например:

WITH input AS (
    SELECT * FROM (VALUES
        (1, map(array['a', 'c'], array[50, 42])), 
        (1, map(array['a', 'b'], array[50, 18]))
    ) t(customer_id, m)
),
sum_by_map_key AS (
    SELECT customer_id, k, sum(v) AS s
    FROM input
    CROSS JOIN UNNEST(map_entries(m)) AS u(k, v)
    GROUP BY customer_id, k
)
SELECT customer_id, map_agg(k, s)
FROM sum_by_map_key
GROUP BY customer_id;

Выходы:

 customer_id |        _col1
-------------+---------------------
           1 | {a=100, b=18, c=42}
(1 row)

Примечание: простодобавить две карты, как это, вы можете использовать map_zip_with.Тем не менее, чтобы использовать его при агрегировании по нескольким строкам, вам, вероятно, понадобится объединить все значения карт в один array и запустить сокращение массива для него.Объединение всех карт в одну array(map) может работать или не работать, в зависимости от размера этих массивов.

...