Het is de juiste JSON in die zin dat het geldig is, maar het is duidelijk niet wat je wilt. Het antwoord hangt dus af van de definitie van "juist". We gaan ervan uit dat wat je wilt "correct" is.
Je vraagt het om u
. te verzamelen , wat een resultatenset is met kolom team
. Dit betekent dat deze informatie aan het resultaat moet worden toegevoegd. Vraag alleen om aggregatie van u.team
, wat het gewenste veld is. Dan krijgt u het gewenste resultaat.
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;
Resultaat: