|
union 改写left join,效率和newkid方法1差不多
- with p as (
- select
- passenger_id,
- departure_station,
- arrival_station,
- row_number() over (
- partition by
- departure_station,
- arrival_station order by passenger_id
- ) sid
- from
- passenger
- ),
- t0 as (
- select
- train_id,
- departure_station,
- arrival_station,
- seat_count,
- sum(seat_count) over (
- partition by
- departure_station,
- arrival_station
- order by
- train_id
- ) sum_sid,
- sum(seat_count) over (
- partition by
- departure_station,
- arrival_station
- ) sum_d_a
- from
- train
- ),
- t as(
- select
- train_id,
- departure_station,
- arrival_station,
- sum_sid,
- sum_sid-seat_count+1 start_sid,
- sum_d_a+(sum_sid-seat_count) // 10 +1 start_stand_id,
- sum_d_a+ sum_sid // 10 end_stand_id,
- sum_d_a+sum_d_a//10 sum_seat_number
- from
- t0
- )
- select
- passenger_id,
- p.departure_station,
- p.arrival_station,
- train_id,
- (sid-start_sid) // 100 +1 coach_number ,
- concat(cast((sid-1)%100 // 5 +1 as varchar), substr('ABCEF',(sid-1)%5+1,1)) seat_number
- from
- p
- join t on p.departure_station=t.departure_station and p.arrival_station=t.arrival_station and
- p.sid between start_sid and sum_sid
- union all
- select
- passenger_id,
- p.departure_station,
- p.arrival_station,
- train_id,
- null coach_number ,
- '无座' seat_number
- from
- p
- join t on p.departure_station=t.departure_station and p.arrival_station=t.arrival_station and
- p.sid between start_stand_id and end_stand_id
- union all
- select
- passenger_id,
- p.departure_station,
- p.arrival_station,
- NULL train_id, NULL coach_number,NULL seat_number
- from
- p
- join (select
- departure_station,
- arrival_station,
- sum_seat_number
- from t
- group by departure_station,
- arrival_station, sum_seat_number)t on p.departure_station=t.departure_station and p.arrival_station=t.arrival_station and
- p.sid >sum_seat_number
- order by passenger_id;
- -- select count(*),substr(seat_number,-1,1) from r group by substr(seat_number,-1,1) order by 2;
复制代码 |
|