Đó là JSON chính xác theo nghĩa là nó hợp lệ, nhưng rõ ràng nó không phải những gì bạn muốn. Vì vậy, câu trả lời phụ thuộc vào định nghĩa của "đúng". Chúng tôi sẽ cho rằng những gì bạn muốn là "đúng".
Bạn đang yêu cầu nó tổng hợp u
, là tập kết quả với cột team
. Điều này có nghĩa là nó sẽ phải thêm thông tin này vào kết quả. Bạn chỉ nên yêu cầu tổng hợp u.team
, đó là lĩnh vực bạn muốn. Sau đó, bạn sẽ nhận được kết quả như mong muốn.
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;
Kết quả: