Узнайте пропущенный альтернативный номер - PullRequest
0 голосов
/ 15 октября 2019

Данные приведены ниже, как найти пропущенное событие между записями. если вы видите ниже, данные о событии up отсутствуют (Record4)

Datetime,            Event_Type
2019-01-01 00:15:00, Down - Record1
2019-01-01 08:00:00, Up  - Record2
2019-01-01 12:15:00, Down - Record3
2019-01-02 08:00:00, Down - Record5
2019-01-02 13:00:00, Up   - Record6

В моих результатах должны отображаться записи об исключениях, в которых отсутствуют последовательные события

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Моя лучшая интерпретация заключается в том, что вы хотите чередовать "вверх" и "вниз". Если это так, вы можете получить недостающие строки, используя lag():

select t.*,
       (case when event_type = 'UP' then 'DOWN' else 'UP' 
        end) as missing_event_type
from (select t.*,
             lag(event_type) over (order by datetime) as prev_event_type
      from t
     ) t
where prev_event_type <> event_type;
0 голосов
/ 15 октября 2019

если значение даты и времени уникально, что-то вроде этого должно работать

SELECT 
  CASE
    WHEN t.event_type = 'DOWN' THEN 'UP'
    ELSE 'DOWN'
  END as missing,
  prev_ids.line_number
FROM my_table t
INNER JOIN
  (SELECT 
    t.datetime, 
    MAX(t2.datetime) as previous_datetime, 
    COUNT(t2.datetime) + 1 as line_number
  FROM my_table t LEFT JOIN my_table t2 ON t.datetime > t2.datetime
  GROUP BY t.datetime
) prev_ids ON t.datetime = prev_ids.datetime
INNER JOIN my_table as prev 
  ON prev.datetime = prev_ids.previous_datetime
WHERE prev.event_type = t.event_type

prev_ids - мы получаем предыдущее время даты для каждой записи и подсчитываем предыдущие записи, чтобы получить номер строки

, а затем просто проверяемесли тип события в записи равен предыдущему типу события, то здесь отсутствует

...