[英]PostgreSQL json_array_elements with array indexes (keys)
[英]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.