У меня есть следующие данные в таблице совпадений:
5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Я хочу выбрать каждую отдельную команду в таблице по имени. то есть я хочу, чтобы запрос возвращался:
6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Итак, каждая команда из последнего раза, когда команда появляется в таблице.
Я использовал следующее (от здесь):
WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team FROM matches)
SELECT MAX(id) AS max_id, team FROM t GROUP BY team->'Name';
Но это возвращает:
ERROR: could not identify an equality operator for type json SQL state: 42883 Character: 1680
Я понимаю, что Postgres не имеет равенства для JSON. Мне нужно только равенство для имени команды (строка), игроков в этой команде не нужно сравнивать.
Может ли кто-нибудь предложить альтернативный способ сделать это?
Для справки:
SELECT id, json_array_elements(match->'Teams') AS team FROM matches
возвращает:
5;"{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]}"
5;"{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}"
6;"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
6;"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
EDIT: я нажал text
и после этот вопрос, я использовал DISTINCT ON
вместо GROUP BY
. Здесь мой полный запрос:
WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team
FROM matches ORDER BY id DESC)
SELECT DISTINCT ON (team->>'Name') id, team FROM t;
Возвращает то, что я хотел выше. У кого-нибудь есть лучшее решение?