arrays - 使用 json_array_elements(json) 并获取项目排名

标签 arrays json postgresql

我有一个由两级数组组成的 json,例如:

[
  {
    name: "Group one",
    races: 
    [
     {name: "Race 1"},
     {name: "Race 2"},
    ]
  },
  {
    name: "Group two",
    races: 
    [
     {name: "Race 10"},
     {name: "Race 11"},
    ]
  }
]

是否可以通过神奇的 SQL 获得:

group_num | race_num | race
int       | int      | json
1         | 1        | {name: "Race 1"}
1         | 2        | {name: "Race 2"}
2         | 1        | {name: "Race 10"}
2         | 2        | {name: "Race 11"}

其中:

  • group_num 是每个组在其数组中的排名
  • race_num 是每个种族在其数组中的排名

我认为这可能与 json_array_elements(json)row_number() OVER () 有关,但我不知道如何正确处理!

最佳答案

with my_table(data) as (
values(
'[
  {
    "name": "Group one",
    "races": 
    [
     {"name": "Race 1"},
     {"name": "Race 2"}
    ]
  },
  {
    "name": "Group two",
    "races": 
    [
     {"name": "Race 10"},
     {"name": "Race 11"}
    ]
  }
]'::json)
)
select 
    group_num, 
    rank() over (partition by group_num order by value->>'name') as race_num,
    value as race
from (
    select 
        rank() over (order by value->>'name') as group_num, 
        value as grp
    from my_table,
    json_array_elements(data)
    ) s,
json_array_elements(grp->'races');

结果:

 group_num | race_num |        race         
-----------+----------+---------------------
         1 |        1 | {"name": "Race 1"}
         1 |        2 | {"name": "Race 2"}
         2 |        1 | {"name": "Race 10"}
         2 |        2 | {"name": "Race 11"}
(4 rows)    

注意,你的json无效,使用jsonlint验证 json 表达式。

关于arrays - 使用 json_array_elements(json) 并获取项目排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986915/

相关文章:

jquery - 使用 JSON.stringify 在 localStorage 中存储数组

python - 如何将字节数组的内容复制到列表 (Python)?

json - 读取 JSON "not an object"

java - Spring boot创建一个主题并发布以便APPS可以接收它

python - 将列表分成对角线?

java - 如何将bin文件读取到字节数组?

javascript - $.ajax() 和 "Uncaught ReferenceError: data is not defined"

php - 从 PHP Json 对象填充 JQuery 数据表

postgresql - 在 PostgreSQL 中的两个日期之间的每个月创建一行

django - postgres 和 docker 组合 : change service status to ready after additional initialization