2009-12-17 59 views
0

涉及到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

获取未备份的节点列表(从您向我们展示的架构)是不可能的。

得到那个在24小时逾期节点列表很简单:

select nodeid, max(eventtime) 
from your_table 
group by nodeid 
having max(eventtime) < now() - '24 hours'::interval 
+0

需要哪些附加信息?例如,我可以做另一个查询来列出所有应该在其上运行备份的nodeid。 – stsquad 2009-12-18 10:55:00

+0

这会有所帮助。 – 2009-12-18 13:22:01

0

下面的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小时运行的节点报告。

分享和享受。

+0

只是一些细微的变化,这应该是罚款:“SYSDATE”变成了“现在()”和“间隔“2日”变成“'2天'::间隔”或“间隔'2天'” – araqnid 2009-12-17 21:11:35