gpt4 book ai didi

sql - 如何以特定顺序选择(几乎)唯一值

转载 作者:行者123 更新时间:2023-12-04 11:04:32 27 4
gpt4 key购买 nike

在一次旅行中,有多个停靠点,(一个停靠点 = 一个或多个订单加载或交付的地址),按特定顺序排列。
例如:

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

( Action :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 , 并加入它,或加入 null如果没有更高的 trip_order .然后它只选择 place , action ,或者两者都不同,或者连接表中没有位置 ( a2.place is 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

这是一个更新的 fiddle : http://sqlfiddle.com/#!9/fdf9c/14

关于sql - 如何以特定顺序选择(几乎)唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983475/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com