Det er korrekt JSON på en måde, at det er gyldigt, men det er tydeligvis ikke, hvad du ønsker. Så svaret afhænger af definitionen af "korrekt". Vi vil antage, at det du ønsker er "korrekt".
Du beder den om at samle u
, som er et resultatsæt med kolonnen team
. Det betyder, at den bliver nødt til at tilføje disse oplysninger til resultatet. Du bør kun bede om sammenlægning af u.team
, hvilket er det felt, du ønsker. Så får du det resultat, du ønsker.
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;
Resultat: