マッチ テーブルに次のデータがあります。
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"}]}"
編集:私はこの質問にキャストし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;
私が上で欲しかったものを返します。誰かがより良い解決策を持っていますか?