您可以使用jsonb_build_object()
为每个code
/id_provider
元组创建一个 json 对象,并用于jsonb_agg
将它们聚合到一个 json 数组中:
WITH data(id, code, id_provider) AS (
VALUES
(41108,2450,'provider1'),
(41108,1064389,'provider4'),
(41108,609920,'provider2'),
(41108,540582,'provider3'),
(41108,228268,'provider2'),
(41108,169483,'provider2'),
(41108,93361,'provider2'),
(41108,47723,'provider1'),
(41109,2658780,'provider4'),
(41109,62348,'provider1'),
(41109,320588,'provider3'),
(41109,323161,'provider3'),
(42500,NULL,'')
)
SELECT id, jsonb_agg(jsonb_build_object(id_provider, code))
FROM data
GROUP BY id
;
┌───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ jsonb_agg │
├───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 41109 │ [{"provider4": 2658780}, {"provider1": 62348}, {"provider3": 320588}, {"provider3": 323161}] │
│ 41108 │ [{"provider1": 2450}, {"provider4": 1064389}, {"provider2": 609920}, {"provider3": 540582}, {"provider2": 228268}, {"provider2": 169483}, {"provider2": 93361}, {"provider1": 47723}] │
│ 42500 │ [{"": null}] │
└───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(3 rows)
如果您不想保留code IS NULL
仅添加WHERE
子句的行:
WITH data(id, code, id_provider) AS (
VALUES
(41108,2450,'provider1'),
(41108,1064389,'provider4'),
(41108,609920,'provider2'),
(41108,540582,'provider3'),
(41108,228268,'provider2'),
(41108,169483,'provider2'),
(41108,93361,'provider2'),
(41108,47723,'provider1'),
(41109,2658780,'provider4'),
(41109,62348,'provider1'),
(41109,320588,'provider3'),
(41109,323161,'provider3'),
(42500,NULL,'')
)
SELECT id, jsonb_agg(jsonb_build_object(id_provider, code))
FROM data
WHERE code IS NOT NULL
GROUP BY id
;
┌───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ jsonb_agg │
├───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 41109 │ [{"provider4": 2658780}, {"provider1": 62348}, {"provider3": 320588}, {"provider3": 323161}] │
│ 41108 │ [{"provider1": 2450}, {"provider4": 1064389}, {"provider2": 609920}, {"provider3": 540582}, {"provider2": 228268}, {"provider2": 169483}, {"provider2": 93361}, {"provider1": 47723}] │
└───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(2 rows)