SQL как исключить данные с использованием даты и не существует в той же таблице - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь исключить некоторые данные в своем запросе, но не смог сам разобраться после поиска по ключевым словам.

enter image description here

Выше приведен пример таблицы со столбцами, которые у меня есть со следующим запросом:

SELECT id, date, health, state, reason FROM table1

моя цель - исключить (состояние = НАЧАЛО) и случаи, когда (здоровье = НЕТ && причина = REASON1) если это произойдет через 10 минут после начала START. Можно иметь (здоровье = НЕТ && причина = REASON1) после 10 минут события START, и я хочу оставить их там, как есть, если условие в течение 10 минут не соответствует.

Ниже приведена цель Я хотел достичь.

enter image description here

Исключить (состояние = НАЧАЛО) было очень легко:

SELECT id, date, health, state, reason FROM table1 WHERE state not in ('START')

но я не смог выяснить, как исключить (здоровье = НЕТ && причина = REASON1), если это происходит через 10 минут после начала START.

Моя идея заключалась в использовании DATEDIFF, а не в существовании, как в следующем :

SELECT id, date, health, state, reason FROM table1 WHERE state not in ('START') and (health = 'NO' and reason = 'REASON1' and DATEDIFF(minute,(current_date)?,(last starting time)?) < 15)

(current_date)?, (Время последнего запуска)? части я не уверен, как этого добиться. Я думаю, что я должен использовать NOT EXISTS также для второго условия, но тот, который я попробовал, не сработал. Кто-нибудь может помочь или дать мне направление на go?

1 Ответ

3 голосов
/ 18 апреля 2020

Если я правильно понимаю, вы можете использовать оконную функцию для расчета предыдущей даты начала. Тогда фильтрация довольно проста:

SELECT id, date, health, state, reason
FROM (SELECT t1.*,
             MAX(CASE WHEN state = 'START' THEN date END) OVER (PARTITION BY id ORDER BY date) as prev_start_date
      FROM table1 t1
     ) t1
WHERE state <> 'START' OR
      (health = 'NO' AND
       reason = 'REASON1' AND
       prev_start_date > date - interval 10 minute
      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...