Postgres中的GROUP BY - JSON数据类型不相等?

jan*_*son 18 sql postgresql json greatest-n-per-group lateral

我在匹配表中有以下数据:

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]}
Run Code Online (Sandbox Code Playgroud)

我想按名称选择表格中每个最后一个不同的团队.即我想要一个将返回的查询:

6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Run Code Online (Sandbox Code Playgroud)

所以每个团队从上次那个团队出现在表中.
我一直在使用以下(从这里):

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';
Run Code Online (Sandbox Code Playgroud)

但这回归:

ERROR: could not identify an equality operator for type json
SQL state: 42883
Character: 1680
Run Code Online (Sandbox Code Playgroud)

我知道Postgres 没有JSON的相等性.我只需要团队名称(字符串)的相等性,该团队中的队员不需要进行比较.

任何人都可以建议另一种方法吗?
以供参考:

SELECT id, json_array_elements(match->'Teams') AS team FROM matches
Run Code Online (Sandbox Code Playgroud)

收益:

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"}]}"
Run Code Online (Sandbox Code Playgroud)

编辑:我转向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;
Run Code Online (Sandbox Code Playgroud)

返回我想要的内容.有没有人有更好的解决方案?

Erw*_*ter 10

通过连接更短,更快,更优雅LATERAL:

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;  -- to get the "last"
Run Code Online (Sandbox Code Playgroud)

如果你只是想要不同的团队,ORDER BY那就可以了.有关:

JSON和平等

jsonPostgres中的数据类型没有相等运算符,但有一个jsonb(Postgres 9.4+):

  • 由于jsonb在9.4+中有一个相等运算符,你可以在某些情况下使用`my_json_column :: jsonb`将json列转换为jsonb. (7认同)