Ini adalah JSON yang benar dalam arti valid, tetapi jelas bukan itu yang Anda inginkan. Jadi jawabannya tergantung pada definisi "benar". Kami akan menganggap bahwa apa yang Anda inginkan adalah "benar".
Anda memintanya untuk menggabungkan u
, yang merupakan hasil dengan kolom team
. Ini berarti ia harus menambahkan informasi ini ke hasil. Anda hanya harus meminta agregasi u.team
, yang merupakan bidang yang Anda inginkan. Maka Anda akan mendapatkan hasil yang Anda inginkan.
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;
Hasil: