Arrays 使用json_数组_元素(json)并获取项目等级

Arrays 使用json_数组_元素(json)并获取项目等级,arrays,json,postgresql,Arrays,Json,Postgresql,我有一个由两级数组组成的json,如: [ { name: "Group one", races: [ {name: "Race 1"}, {name: "Race 2"}, ] }, { name: "Group two", races: [ {name: "Race 10"}, {name: "Race 11"}, ] } ] 是否可以通过magic SQL获得: g

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

[
  {
    name: "Group one",
    races: 
    [
     {name: "Race 1"},
     {name: "Race 2"},
    ]
  },
  {
    name: "Group two",
    races: 
    [
     {name: "Race 10"},
     {name: "Race 11"},
    ]
  }
]
是否可以通过magic 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\u array\u elements(json)
row\u 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无效,请用于验证json表达式。

如何在json上运行SQL?或者你从哪里得到的JSON?您是否运行了一个现有的查询来获取该信息?