2017-07-08 15 views
2

我做的陣列的兩個級別一樣的JSON:使用json_array_elements(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()的,但我想不出如何作出正確的!

+0

如何在JSON上運行SQL?或從哪裏獲得該JSON?你運行一個現有的查詢來獲得? – OverCoder

回答

0
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表達式。

+0

好的查詢。它的工作是正確的。謝謝 ! – mnementh64