2015-09-15 24 views
-1

我正在處理一個項目,我試圖在SQL Server數據庫中顯示某條日誌消息時,將SQL查詢的結果通過電子郵件發送出去。SQL Query根據3個條件返回一行或一個字段

我的第一個目標是隔離我需要的數據。相關表格如下:

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 

我很感興趣,特別是最後Time當系統1002生成LogSuccess。看起來很簡單,但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部分的任何幫助或洞察將是最有幫助的。

+0

您是否熟悉TOP 1和ORDER BY? –

回答

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) 
+0

是的,抱歉不太清楚;指數是一個PK – user5818

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 
0

在日誌表中添加一個新字段(標誌),默認爲FALSE。每當您發送關於記錄的電子郵件時,每次您要發送電子郵件時都將標誌字段設置爲TRUE/ ,只需檢查日期最高的記錄,並且只在標誌字段爲False時發送電子郵件。如果標誌字段爲TRUE,則忽略它。

相關問題