Поиск любых строк, где время последнего события превышает указанный период - PullRequest
0 голосов
/ 17 декабря 2009

Относится к 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 часа (и я предполагаю, что резервное копирование вообще не происходило, хотя в этой базе данных есть узлы, резервное копирование которых не выполняется (как они разные типы узлов)).

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Получение списка узлов, которые не были заархивированы - из вашей схемы, которую вы нам показали - невозможно.

Получение списка узлов, которые просрочены на 24 часа, тривиально:

select nodeid, max(eventtime)
from your_table
group by nodeid
having max(eventtime) < now() - '24 hours'::interval
0 голосов
/ 17 декабря 2009

Следующий 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 часов.

Делись и наслаждайся.

...