Sql server 基于3个条件返回一行或一个字段的SQL查询

Sql server 基于3个条件返回一行或一个字段的SQL查询,sql-server,sql-server-2008,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

我正在从事一个项目,当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在
日志中生成
成功
时的最后一次
时间。似乎很简单,但
系统
日志
不是唯一的记录,以下是:

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
我只对最后一行
时间感兴趣
发生这种情况,因此最后一行:

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部分的任何帮助或见解都将非常有用

如果我正确理解索引是唯一的,并且值越高记录越新,那么您可以这样做

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
 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) 
将新字段(标志)添加到日志表中,默认值为FALSE。无论何时发送有关记录的电子邮件,请将标志字段设置为TRUE/
每次您想要发送电子邮件时,只需检查具有最高日期的记录,并且仅在标志字段为False时发送电子邮件。如果标志字段为TRUE,则忽略它。

您熟悉TOP 1和ORDER BY吗?