Вы можете разбить вашу карту на отдельные пары ключ / значение с помощью 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)
может работать или не работать, в зависимости от размера этих массивов.