在一次旅行中,按照特定的顺序有几个停靠点(停止=加载或交付一个或多个订单的地址).
例如:
例如:
Trip A Trip_order Action Place Ordernumber 10 Load Paris 394798 20 Load Milan 657748 30 UnLoad Athens 657748 40 Unload Thessaloniki 394798 50 Load Thessaloniki 10142 60 Load Thessaloniki 6577 70 Unload Athens 6577 80 Unload Athens 10412 90 Load Thessaloniki 975147 100 Unload Paris 975147
我希望按行程顺序查看具体的停靠点:
Load Paris Load Milan Unload Athens Unload Thessaloniki Load Thessaloniki Unload Athens Load Thessaloniki Unload Paris
我确实看过This,但如果我这样做,我只能卸载雅典,卸载塞萨洛尼基并加载塞萨洛尼基一次.
我该如何解决这个问题?
编辑:11:11(UTC 01:00)
更具体地说:这些是提供此信息的表格:
Trips Trip_ID 100001 100002 100003 .... Actions Trip_ID Action MatNr RoOr RoVlg OrderID 100001 1 10 10 1 394798 100001 1 10 20 1 657748 100001 1 10 30 1 657748 100001 1 10 40 1 394798 100001 1 10 50 1 10142 100001 1 10 60 1 6577 100001 1 10 70 1 6577 100001 1 10 80 1 10412 100001 1 10 90 1 975147 100001 1 10 100 1 975147
(动作:1 =加载,4 =卸载)
MatNr,RoOr和RoVlg的组合是Trip的顺序.
Orders OrderID LoadingPlace UnloadingPlace 6577 Thessaloniki Athens 10142 Thessaloniki Athens 394798 Paris Thessaloniki 657748 Milan Athens 975147 Thessaloniki Paris
解决方法
试试这个.没有变数,没什么特别的花哨:
select a1.action,a1.place from trip_a a1 left join trip_a a2 on a2.trip_order = (select min(trip_order) from trip_a a3 where trip_order > a1.trip_order) where a1.action != a2.action or a1.place != a2.place or a2.place is null
在这里演示:http://sqlfiddle.com/#!9/4b6dc/13
希望它适用于你正在使用的任何sql,它应该,只要支持子查询.
Tt只是找到下一个最高的trip_id,并加入它,或者如果没有更高的trip_order则加入null.然后,它仅选择地点,操作或两者不同的行,或者如果连接表中没有位置(a2.place为null).
标准完全改变后编辑
如果要获得完全从基表构建的相同结果,可以执行以下操作:
select case when a.action = 1 then 'load' when a.action = 0 then 'unload' end as action,case when a.action = 1 then o.loadingplace when a.action = 0 then o.unloadingplace end as place from trips t inner join actions a on t.trip_id = a.trip_id inner join orders o on a.orderid = o.orderid left join actions a2 on a2.roor = (select min(roor) from actions a3 where a3.roor > a.roor) left join orders o2 on a2.orderid = o2.orderid where a.action != a2.action or a2.action is null or case when a.action = 1 then o.loadingplace != o2.loadingplace when a.action = 0 then o.unloadingplace != o2.unloadingplace end order by a.roor asc
这是一个更新的小提琴:http://sqlfiddle.com/#!9/fdf9c/14