Es ist korrektes JSON in dem Sinne, dass es gültig ist, aber es ist eindeutig nicht das, was Sie wollen. Die Antwort hängt also von der Definition von "richtig" ab. Wir gehen davon aus, dass das, was Sie wollen, "richtig" ist.
Sie fordern es auf, u
zu aggregieren , bei dem es sich um eine Ergebnismenge mit der Spalte team
handelt . Dies bedeutet, dass diese Informationen zum Ergebnis hinzugefügt werden müssen. Sie sollten nur nach Aggregation von u.team
fragen , das ist das gewünschte Feld. Dann erhalten Sie das gewünschte Ergebnis.
WITH matches as
(
select 5 as id, '{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}'::json as match
union all
select 6 as id, '{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}' as match
)
SELECT json_agg(u.team) FROM (
SELECT DISTINCT ON (t.team->>'Name') t.team
FROM matches m, json_array_elements(m.match->'Teams') t(team)
ORDER BY t.team->>'Name', m.id DESC) AS u;
Ergebnis: