我有以下数据表:
Vessel DateStamp Position Capacity (%) Destination
ALPHA 2016-07-17 09:51:00 P 30 A
BETA 2016-07-17 09:51:00 Q 75 B
GAMMA 2016-07-17 09:51:00 R 78 C
ALPHA 2016-07-16 09:51:16 S 30 D
BETA 2016-07-16 09:51:16 T 75 E
GAMMA 2016-07-16 09:51:16 U 78 F
ALPHA 2016-07-15 09:51:10 V 30 G
BETA 2016-07-15 09:51:10 W 40 H
GAMMA 2016-07-15 09:51:10 X 78 I
这可能听起来很奇怪,但是:
我希望能够添加另一个名为' Origin'基于“位置”中的什么位置'列中容量中的对应值'列移动超过' 70%'
因此船舶GAMMA的起源是' X' 船舶BETA的原产地为' T' 和船舶ALPHA没有原产地
实际来源是容量从低于70%变为高于70%的位置
这必须按时间顺序依赖。就好像一艘船进入一个空旷的港口装满了货物'超过70%然后前往目的地
我希望这很清楚。我可以在必要时回答任何问题
非常感谢
答案 0 :(得分:1)
对于船舶,您希望检索容量超过70%的同一船舶的行的Position
列中的值,以及上一行(如果存在)的容量的值同一艘船不超过70%。
在SQL中:
UPDATE MyTable
SET Origin = (SELECT Position
FROM MyTable AS T2
WHERE T2.Vessel = MyTable.Vessel
AND T2.Capacity >= 70
AND ifnull((SELECT Capacity
FROM MyTable AS T3
WHERE T3.Vessel = T2.Vessel
AND T3.DateStamp < T2.DateStamp
ORDER BY DateStamp DESC
LIMIT 1
), 0) < 70);
答案 1 :(得分:1)
上面的解决方案可能还不错,但还没看好。这是我的,可能过于复杂。
首先,您已将其标记为Python,但问题不包含任何python。我将其视为SQL问题。
您似乎在非摘要表中添加了“摘要”列。即Vessel BETA具有1个Origin值,但该表显示了BETA的几个记录,其中一些记录与该特定来源无关。这很好,但它只是涉及一些“扭曲”,因此你将在下面看到愚蠢的连接数
假设上述示例数据来自以下查询
ng serve -lr
然后你可以进行以下查询
SELECT Vessel, DateStamp, Position, Capacity, Destination FROM VESSEL_POSITIONS ORDER BY DateStamp DESC
当容量超过70时,它将为您提供每艘船的最早时间(不确定这是否是您想要的) 容量不超过70的船只不会出现在这里。
然后你可以按如下方式进行INNER JOIN
SELECT Vessel, MIN(DateStamp) AS DateStamp FROM VESSEL_POSITIONS WHERE Capacity > 70 GROUP BY Vessel
它将在那些时间给你那些船只的位置,标记为Origin。
然后使用OUTER JOIN将其连接到原始查询以获取额外的Origin列,从未有超过70%的容量的容器将显示为null
SELECT pos.Vessel AS Vessel, pos.Position AS Origin FROM VESSEL_POSITIONS pos
INNER JOIN
(SELECT Vessel, MIN(DateStamp) AS DateStamp FROM VESSEL_POSITIONS WHERE Capacity > 70 GROUP BY Vessel) dat
ON pos.Vessel = dat.Vessel and pos.DateStamp = dat.DateStamp)
哪个应该与您发布的表格相同,但附加列
SELECT p.Vessel, p.DateStamp, p.Position, p.Capacity, p.Destination, o.Origin FROM VESSEL_POSITIONS
OUTER JOIN
(SELECT pos.Vessel AS Vessel, pos.Position AS Origin FROM VESSEL_POSITIONS pos
INNER JOIN
(SELECT Vessel, MIN(DateStamp) AS DateStamp FROM VESSEL_POSITIONS WHERE Capacity > 70 GROUP BY Vessel) dat
ON pos.Vessel = dat.Vessel and pos.DateStamp = dat.DateStamp)) o
ON p.Vessel = o.Vessel
ORDER BY DateStamp DESC