SQL коррекция базы данных - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть устройство, которое отправляет событие в базе данных SQL. Событие в журнале выглядит так:

index|eventNumber|TriggerTime|RecoverTime

Проблема, с которой я сталкиваюсь, заключается в том, что если они имеют выключенное / включенное питание на устройстве, которое создает событие sont unrecover, подобное

index|eventNumber|TriggerTime|RecoverTime
1|2|2020-04-03 8:00|2020-04-03 8:10
2|3|2020-04-03 8:00|2020-04-03 8:30
3|3|2020-04-03 8:20|NULL
4|2|2020-04-03 8:21|2020-04-03 8:23
5|3|2020-04-03 8:40|NULL

Что я хочу сделать, это скопировать triggerTime следующего события с тем же номером события в recoveryTime. Вот так

index|eventNumber|TriggerTime|RecoverTime
1|2|2020-04-03 8:00|2020-04-03 8:10
2|3|2020-04-03 8:00|2020-04-03 8:30
3|3|2020-04-03 8:20|2020-04-03 8:40
4|2|2020-04-03 8:21|2020-04-03 8:23
5|3|2020-04-03 8:40|NULL

Как лучше всего это сделать?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

сервер mysql - 5.7, поэтому он не имеет функции лидера. Я нахожу способ сделать выбор, чтобы добавить двоеточие со значением, чтобы поместить в нулевое место, но я не знаю, как поместить его в обновление.

    (SELECT 
 event_index, event_log_index, `trigger_time@timestamp`, `recover_time@timestamp`
 , (SELECT 
     `trigger_time@timestamp`
    FROM 
     plc.`test` alfabetInner 
    WHERE
      alfabetInner.`trigger_time@timestamp` > plc.`test`.`trigger_time@timestamp` AND alfabetInner.`event_log_index` = plc.`test`.`event_log_index`
    ORDER BY 
      `trigger_time@timestamp` ASC
    LIMIT 0, 1      
   ) AS 'Nexttrigger_time@timestamp'

FROM 
 plc.`test`  
ORDER BY
 `trigger_time@timestamp` ASC)
0 голосов
/ 03 апреля 2020

Вы можете использовать lead():

select el.*,
       coalesce(recovertime,
                lead(triggertime) over (partition by eventnumber order by triggertime)
               ) as new_recovertime
from eventlog;

Если вам нужно это в update, вы можете использовать join

update eventlog el join
       (select el.*,
               lead(triggertime) over (partition by eventnumber order by triggertime) as new_recovertime
        from eventlog
       ) el2
       on el2.eventnumber = el.eventnumber and
          el2.eventtime = el.eventtime
    set recovertime = new_recovertime
    where recovertime is null and new_recovertime is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...