Поиск любых строк, в которых время последнего события относится к указанному периоду
-
20-09-2019 - |
Вопрос
Это относится к OpenNMS, где я пытаюсь написать автоматизацию на SQL.У меня есть система, которая отправляет события в таблицу каждый раз, когда резервное копирование завершается успешно.Я хочу определить, просрочена ли резервная копия для какого-либо данного узла.Так, например, (упрощенная) таблица выглядит следующим образом:
nodeid, eventid, eventuei, eventtime
1 , 1 , backupOk, 09:20 15/12/09
2 , 2 , backupOk, 09:25 15/12/09
3 , 3 , backupOk, 09:30 15/12/09
1 , 4 , backupOk, 09:20 16/12/09
2 , 5 , backupOk, 09:25 16/12/09
2 , 6 , backupOk, 09:25 17/12/09
3 , 7 , backupOk, 09:30 17/12/09
Итак, что мне нужно, так это список nodeid, где резервное копирование просрочено на 24 часа (и я предполагаю, что резервное копирование вообще не производилось, хотя в этой базе данных есть узлы, которые не получают резервного копирования (поскольку это разные типы узлов)).
Решение
Получение списка узлов, для которых не было создано резервное копирование - из вашей схемы, которую вы нам показали, - невозможно.
Получение списка узлов, просроченных на 24 часа, является тривиальным:
select nodeid, max(eventtime)
from your_table
group by nodeid
having max(eventtime) < now() - '24 hours'::interval
Другие советы
Следующий SQL предназначен для Oracle, но я предполагаю, что в PostgreSQL есть аналогичные средства обработки времени:
SELECT E.NODEID, E.LAST_BACKUP_TIME
FROM (SELECT NODEID, MAX(EVENTTIME) AS LAST_BACKUP_TIME
FROM BACKUP_EVENTS
WHERE EVENTUEI = 'backupOk'
GROUP BY NODEID) E
WHERE E.LAST_BACKUP_TIME < SYSDATE - INTERVAL '2' DAY;
Это позволит получить отчет об узлах, на которых резервное копирование не выполнялось в течение последних 48 часов.
Делитесь и наслаждайтесь.