繁体   English   中英

使用json_array_elements(json)并获取物品等级

[英]Use json_array_elements(json) and get item ranks

我有一个由两个级别的数组组成的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表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM