2017-02-01 4 views
0

Я имею таблицу данных ниже:Добавление столбца в SQL на основе порогового значения и времени

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 не имел бы o Rigin

Фактическое происхождение является местом, где изменения мощности от ниже 70% до 70% выше

Это должно было бы быть хронологическое время зависит. Как будто корабль пускался в порт, загружающий «товары» до 70%, а затем отправлялся в пункт назначения

Надеюсь, это ясно. Я могу ответить на любые вопросы по мере необходимости

Большое спасибо

+0

Значение гаммы никогда не перемещается; почему это должно быть X? –

+0

Привет, CL. Я пытался продемонстрировать, что корабли, где мощность начинается с 70%, будут иметь первую позицию в качестве источника – Ollie

+0

Но первая позиция не X. –

ответ

1

Решение выше, вероятно, хорошо, но не смотрел на нее еще. Вот мой, который потенциально слишком сложный.

Во-первых, вы отметили его как Python, но вопрос не содержит никакого python. Я буду рассматривать его как проблему SQL.

Кажется, что вы добавляете столбец «резюме» в свою сводную таблицу. То есть Судно BETA имеет 1 значение Origin, но в этой таблице показаны несколько записей для BETA, некоторые из которых не связаны с этим конкретным происхождением. Это хорошо, но это только включает в себя немного «скручивание», следовательно, глупое количество присоединяется вы увидите ниже

Допустим, что в приведенном выше примере данные поступают из следующего запроса

SELECT Vessel, DateStamp, Position, Capacity, Destination FROM VESSEL_POSITIONS ORDER BY DateStamp DESC 

Тогда вы могли бы сделать следующий запрос

SELECT Vessel, MIN(DateStamp) AS DateStamp FROM VESSEL_POSITIONS WHERE Capacity > 70 GROUP BY Vessel 

который даст вам самое раннее время для каждого судна, когда мощность составляет более 70 (не уверен, что если то, что вы хотите) Суда потенциала ВОЗ не переходит 70 не отображаются Вот.

Затем вы можете сделать внутреннее соединение следующим образом

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) 

, который даст вам позицию этих судов в те времена, помечен как Origin.

Тогда вы присоединитесь, что исходный запрос с OUTER JOIN, чтобы получить дополнительную колонку происхождения, Сосуды, которые никогда не имели мощность более 70% будет отображаться как нулевой

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 

Который должен дать вам то же самое таблица как та, которую вы опубликовали, но с дополнительной колонкой

**Origin** 
null 
T 
X 
null 
T 
X 
null 
T 
X 
1

Для корабля, вы хотите, чтобы получить значение в Position колонке строки для того же судна, где мощность составляет более 70%, и где потенциал предыдущей строки (если она существует) для одного и того же судна не превышает 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); 
+0

Логика прекрасна, спасибо, но я пытаюсь манипулировать данными в python, поэтому я могу просмотреть ее через интерфейс SQL – Ollie

+0

. Я не совсем уверен, как перевести этот – Ollie