2013-02-25 51 views
1

我需要腳本查詢以放棄不超過預定裕度(例如2秒)的訪問日誌。也就是說,如果每個記錄都是由用戶在特定的日期/時間創建的,我不想讓那些日期/時間不超過範圍的人與之前記錄的日期/時間比較。我認爲一個例子更清晰。帶DateDIFF的複雜SQL查詢

例子:

LogIndex, UserID, Date/Time 

1. 01551, 20.02.2013 17:41:45.000 
2. 01551, 20.02.2013 17:41:45.900 * 
3. 01551, 20.02.2013 17:41:46.150 * 
4. 01551, 20.02.2013 20:41:47.000 

5. 01552, 02/20/2013 17:42:45.000 
6. 01552, 20.02.2013 17:42:46.000 * 
7. 01552, 02/20/2013 19:45:45.000 * 

記錄丟棄,因爲它的日期/時間不超過以前的記錄超過2秒的保證金。在第一種情況下,應該放棄兩條記錄,因爲兩條記錄都不超過此邊界。

下面是一個創建臨時表,並增加了以前的紀錄,以測試代碼:提前

CREATE TABLE # TEMP (LogIndex int, UserID nvarchar (10), LogTime datetime) 

insert into # temp select 1, '01551 ', '20/02/2013 17:41:45.000' 
insert into # temp select 2, '01551 ', '20/02/2013 17:41:45.900' 
insert into # temp select 3, '01551 ', '20/02/2013 17:41:46.150' 
insert into # temp select 4, '01551 ', '20/02/2013 20:41:47.000' 
insert into # temp select 5, '01552 ', '20/02/2013 17:42:45.000' 
insert into # temp select 6, '01552 ', '20/02/2013 17:42:46.000' 
insert into # temp select 7, '01552 ', '20/02/2013 19:45:45.000' 

select * from # temp 

DROP TABLE # temp 

謝謝!

回答

0

你有沒有考慮過解決這個問題呢?

您可以在表格中創建INSERT -Trigger,該表格存儲訪問日誌和拒絕數據,其中前任的時差小於您定義的值。根據userID獲取最後保存的數據並將其與當前數據進行比較會比較容易,而不是在收集數據後編寫解決您的任務的查詢。

您可以在一個單獨的表通過INSERT - 觸發器(我相信這個數據來自訪問控制,因此你不能刪除這些記錄,是嗎?)

不過也保存這些日誌,如果你喜歡,實現通過查詢事之後,你可以試試:

WITH "CTE" AS 
(
    SELECT 
     T1.* 
     , diff = DATEDIFF(MS, T2.LogTime, T1.LogTime) 
    FROM 
     #TEMP AS T1 
     LEFT JOIN #TEMP AS T2 
      ON 1 = 1 
      AND T1.LogIndex = T2.LogIndex + 1 
      AND T1.UserID = T2.UserID 
) 
, "ROLSUM" AS 
(
    SELECT 
     * 
     , sumDiff = (SELECT SUM(diff) FROM "CTE" AS C2 WHERE C2.LogIndex <= C1.LogIndex AND C2.UserId = C1.UserId) 
    FROM 
     "CTE" AS C1 
) 
SELECT 
    LogIndex, UserID, LogTime 
FROM 
    ROLSUM 
WHERE 
    sumDiff > 2000 OR sumDiff IS NULL 

當心,此查詢只是一個提示。它適用於演示數據,但如果您根據userID添加更多數據,則會添加更多數據,這些數據在上一次有效和無效數據間隔後應該被拒絕。

我更喜歡第一個變體。之後爲什麼要存儲數據並進行處理,如果您能夠更早更輕鬆地獲得所需內容?