Det är korrekt JSON i en mening att det är giltigt, men det är helt klart inte vad du vill ha. Så svaret beror på definitionen av "rätt". Vi kommer att anta att det du vill ha är "rätt".
Du ber den att samla u
, som är en resultatuppsättning med kolumnen team
. Detta innebär att den måste lägga till denna information till resultatet. Du bör bara be om aggregering av u.team
, vilket är det fält du vill ha. Då får du det resultat du vill ha.
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: