在一次旅行中,按照特定的顺序有几个停靠点(停止=加载或交付一个或多个订单的地址).
例如:
例如:
- 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