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

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]}

我想按名称 Select 表中最后一个不同的团队.i、 e.我想要一个将返回的查询:

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

我知道博士后doesn't have equality for 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:我投到textthis question之后,我用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;

返回我在上面想要的.有谁有更好的解决方案吗?

推荐答案

更短、更快、更优雅,拥有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"

如果你只是想要不同的团队,ORDER BY人可以go .相关的:

JSON与平等

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

Postgresql相关问答推荐

DBT-DBT依赖于未找到的源

为什么我的应用程序接收的是空值而不是布尔值?

PostgreSQL存储过程中不存在游标

在特定距离内创建点的唯一索引

带有附加组的时间刻度 interpolated_average

计算每行的多列中的非 NULL 元素

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

新数据未保存到 Postgres 上的 Rails 数组列

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

Rails 4 迁移: has_and_belongs_to_many table name

使用 PostgreSQL 创建数据透视表

判断materialized视图的上次刷新时间

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

如何从 PostgreSQL 中的 Json 数组中获取元素

PostgreSQL 中是否有类似 zip() 函数的东西,它结合了两个数组?

当从 Heroku pg:pull 数据库时提示:role "root" does not exist.

pg_restore 会覆盖现有的表吗?

查询 JSON 列中的数组元素

使用 Postgresql 数据库(OSX Lion)创建 Rails 3.1 应用程序

PostgreSQL - 如何将数字字段中的秒数转换为 HH:MM:SS