SQL Query根据3个条件返回一行或一个字段

时间:2015-09-15 17:56:38

标签: sql-server sql-server-2008

我正在开发一个项目,当我在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。看起来很简单,但SystemLog不是唯一记录,而是以下内容:

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部分的任何帮助或见解将是最有帮助的。

3 个答案:

答案 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,则忽略它。