根据阈值和时间在SQL中添加一列

时间:2017-02-01 17:19:16

标签: python sqlite time-series

我有以下数据表:

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%然后前往目的地

我希望这很清楚。我可以在必要时回答任何问题

非常感谢

2 个答案:

答案 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