C'est JSON correct dans le sens où c'est valide, mais ce n'est clairement pas ce que vous voulez. La réponse dépend donc de la définition de "correct". Nous supposerons que ce que vous voulez est "correct".
Vous lui demandez d'agréger u
, qui est un ensemble de résultats avec la colonne team
. Cela signifie qu'il devra ajouter ces informations au résultat. Vous ne devez demander que l'agrégation de u.team
, qui est le champ souhaité. Ensuite, vous obtiendrez le résultat souhaité.
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;
Résultat :