我正在开发一个项目,当我在SQL Server数据库中出现某个日志消息时,我试图通过电子邮件发送SQL查询的结果。
我的第一个目标是隔离我需要的数据。相关表格如下:
System | Time | Log | Index
1001 |7/16/2015 7:22 |Fail |1729943
1002 |7/17/2015 10:26|Success |1743789
1002 |7/18/2015 10:26|Success |1743799
1003 |7/22/2015 6:14 |Timeout |1771793
当系统1002在Time
中生成Success
时,我特别感兴趣的是最后 Log
。看起来很简单,但System
和Log
不是唯一记录,而是以下内容:
SELECT *
FROM DB.LogFiles
WHERE System ='1002' and Log ='Success'
返回2行:
System | Time | Log | Index
1002 | 7/17/2015 09:43 | Success | 1743789
1002 | 7/18/2015 10:26 | Success | 1743799
我只是对最后 Time
感兴趣,这种情况发生了,所以最后一行:
1002 | 7/18/2015 10:26 | Success | 1743799
这个过程每天都会重复,所以第二天我会看到以下记录:
System | Time | Log | Index
1002 | 7/17/2015 09:43 | Success | 1743789
1002 | 7/18/2015 10:26 | Success | 1743799
1002 | 7/9/2015 11:42 | Success | 1748752
我希望再次通知新的最后记录
1002 | 7/9/2015 11:42 | Success | 1749261
该项目的最终目标是将查询安排在每几个小时运行一次,并查看是否已输入新的“成功”记录。如果它不是生成电子邮件。我不确定这部分是否可以在SQL中完成,我可能需要查看其他内容以实现此目的。对至少SQL部分的任何帮助或见解将是最有帮助的。
答案 0 :(得分:0)
WITH X AS
(
SELECT [System]
,[Time]
,[Log]
,[Index]
,ROW_NUMBER() OVER (PARTITION BY [System]
ORDER BY CAST([Time] AS DATETIME) DESC) rn
FROM TableName
)
SELECT [System]
,[Time]
,[Log]
,[Index]
FROM X
WHERE rn = 1
答案 1 :(得分:0)
如果我理解正确的索引是唯一的,并且值越高,记录越新,那么你可以做这样的事情。
SELECT a.system, a.time, a.log, a.index
FROM log_files a
WHERE a.System ='1002' and a.Log ='Success'
AND a.index = (SELECT MAX(z.index) FROM log_files z
WHERE z.System = a.System and z.Log = a.Log)
答案 2 :(得分:0)
在日志表中添加一个新字段(Flag),默认为FALSE。每当您发送有关记录的电子邮件时,请将“标记”字段设置为TRUE / 每次要发送电子邮件时,只需检查具有最高日期的记录,并仅在标记字段为False时发送电子邮件。如果Flag字段为TRUE,则忽略它。