У меня есть таблица temp
, определенная следующим образом:
id | name | body | group_id
-------------------------------
1 | test_1 | body_1 | 1
2 | test_2 | body_2 | 1
3 | test_3 | body_3 | 2
4 | test_4 | body_4 | 2
Я хотел бы создать результат, сгруппированный по group_id
и агрегированный для json. Однако запрос такой:
SELECT group_id, json_agg(ROW(id, name, body)) FROM temp
GROUP BY group_id;
Производит этот результат:
1;[{"f1":1,"f2":"test_1","f3":"body_1"},
{"f1":2,"f2":"test_2","f3":"body_2"}]
2;[{"f1":3,"f2":"test_3","f3":"body_3"},
{"f1":4,"f2":"test_4","f3":"body_4"}]
Атрибуты в объектах json называются f1
, f2
, f3
вместо id
, name
, body
по мере необходимости. Я знаю, что можно правильно их использовать, используя подзапрос или общее табличное выражение, например:
SELECT json_agg(r.*) FROM (
SELECT id, name, body FROM temp
) r;
Что дает этот результат:
[{"id":1,"name":"test_1","body":"body_1"},
{"id":2,"name":"test_2","body":"body_2"},
{"id":3,"name":"test_3","body":"body_3"},
{"id":4,"name":"test_4","body":"body_4"}]
Но я, честно говоря, не вижу способа использовать его в сочетании с агрегацией. Что мне не хватает?