Я задавал аналогичный вопрос несколько дней a go, но, к сожалению, я неправильно понял формулировку проблемы, которую я должен решить (точнее, я забыл о ее части). Вот почему этот пост может выглядеть как дублированный, но это не так.
Это мой исходный пост: Oracle sql: фильтрация повторяющихся строк, которые отличаются лишь небольшим промежутком времени
Итак, давайте снова go:
У меня есть таблица Oracle с аварийными сигналами событий, запускаемыми паркиметрами. Сигналы тревоги имеют состояние Открыто / Закрыто, и когда сигнализация Открыта (PKN_EVENTSTATUS = 'Open') и Закрыта (PKN_EVENTSTATUS = 'Close') между небольшим промежутком времени -RECEIVEDDATE- (скажем, например, Open RECEIVEDDATE = x | Close RECEIVEDDATE = x + 30 секунд и, конечно, PKN_EVENTNAME то же самое) обе строки событий (Открытие / Закрытие) считаются «ложным» сигналом («сигналом отказа», который сработал паркиметром по «ошибке») поэтому оба должны быть удалены.
Мне нужно было бы создать Oracle SQL запрос, который выберет все эти «поддельные» сигналы тревоги, чтобы я мог их удалить. Опять же, сигналы, которые имеют небольшую разницу во времени (ДАТА ПОЛУЧЕНИЯ) между состояниями «Открыто» и «Закрыто».
Я начал создавать запрос, который может работать, но он очень медленный, поэтому я даже не могу его проверить потому что это занимает слишком много времени. Я уверен, что его можно оптимизировать, но сейчас не могу найти, как это сделать, поэтому надеюсь, что кто-нибудь может мне помочь.
Мой текущий очень медленный запрос:
select t1.ID, t1.PKN_EVENTNAME, t1.PKN_EVENTSTATUS, t1.RECEIVEDDATE
from PARQUIMETERS_ALARMS t1
where
exists
(select 'x'
from PARQUIMETERS_ALARMS t2
where t1.PKN_EVENTNAME = t2.PKN_EVENTNAME
and ((t1.PKN_EVENTSTATUS = 'Open' and t2.PKN_EVENTSTATUS = 'Close'
and abs(t1.RECEIVEDDATE - t2.RECEIVEDDATE) * 24 * 60 * 60 < 30) -- < 30 sec
or (t1.PKN_EVENTSTATUS = 'Close' and t2.PKN_EVENTSTATUS = 'Open'
and abs(t2.RECEIVEDDATE - t1.RECEIVEDDATE) * 24 * 60 * 60 < 30))) -- < 30 sec