2010-09-17 55 views
0

由於系統中的錯誤,一個跟蹤日誌反覆發射導致應該有一個日誌條目實際上在數百個中。這已經得到解決,但數據仍然存在,需要進行報告(我不能將其全部刪除)。但是我只想要一個數據實例。這將是棘手的,我認爲,這裏是在表中的相關字段:除了一個重複的行,其中datetime列的值在幾秒鐘內刪除所有行嗎?

INT用戶名,詮釋的actorId,爲nvarchar(50)ActorType,INT BoxID,日期時間CREATEDATE,爲nvarchar(50)查詢現在

對於所有這些行都相同且每個行中CreateDate的差異在30秒之內的情況,我想刪除除一個之外的所有行。

所以在上市將會完全匹配的領域和CREATEDATE所有數據都將像範圍:

2010-08-17 14:50:11.620 
2010-08-17 14:50:11.823 
2010-08-17 14:50:12.057 
2010-08-17 14:50:12.277 
2010-08-17 14:50:12.527 
2010-08-17 14:50:12.730 
2010-08-17 14:50:12.980 
2010-08-17 14:50:13.340 
2010-08-17 14:50:13.450 
2010-08-17 14:50:13.667 
2010-08-17 14:50:13.887 
2010-08-17 14:50:14.120 
2010-08-17 14:50:14.323 
2010-08-17 14:50:14.730 
2010-08-17 14:50:14.807 
2010-08-17 14:50:15.010 
2010-08-17 14:50:15.357 
... 
2010-08-17 14:51:09.810 
2010-08-17 14:51:10.047 
2010-08-17 14:51:10.250 
2010-08-17 14:51:10.500 
2010-08-17 14:51:10.890 
2010-08-17 14:51:10.953 
2010-08-17 14:51:11.263 
2010-08-17 14:51:11.437 
2010-08-17 14:51:11.920 
2010-08-17 14:51:12.170 
2010-08-17 14:51:12.217 
2010-08-17 14:51:12.420 
2010-08-17 14:51:12.670 
2010-08-17 14:51:12.873 
2010-08-17 14:51:13.123 
2010-08-17 14:51:13.373 
2010-08-17 14:51:13.577 
2010-08-17 14:51:13.797 
2010-08-17 14:51:14.030 
2010-08-17 14:51:14.280 
2010-08-17 15:29:19.180 
2010-08-17 15:32:32.497 
2010-08-17 15:32:32.733 
2010-08-17 15:32:32.967 
2010-08-17 15:32:33.263 
2010-08-17 15:32:33.513 
2010-08-17 15:32:33.623 
2010-08-17 15:32:33.857 
2010-08-17 15:32:34.140 
2010-08-17 15:32:34.327 
2010-08-17 15:32:34.560 
2010-08-17 15:32:34.780 
2010-08-17 15:32:35.043 
2010-08-17 15:32:35.247 
2010-08-17 15:32:35.483 
2010-08-17 15:32:35.717 

但我只是一個保留一個,我希望這是足夠的信息。

回答

1

下面介紹如何從30秒範圍內的每組記錄中獲得一行。這個查詢可以用來查看你將保留在表中的哪些行。

WITH cte AS 
    (SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, 
     DATEDIFF(ss, '1/1/2000', CreateDate)/30 AS CreateDateGroup, 
     ROW_NUMBER() OVER (PARTITION BY UserID, ActorID, ActorType, BoxID, Query, 
            DATEDIFF(ss, '1/1/2000', CreateDate)/30 
          ORDER BY CreateDate ASC) AS sequence 
    FROM TrackingLog 
    ) 

SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, CreateDateGroup, sequence 
FROM cte 
WHERE sequence = 1 

在公用表格表達式(CTE)中生成兩列。 CreateDateGroup列的計算方法是將CreateDate值轉換爲自「1/1/2000」以來的秒數,再除以30(以秒爲單位)。結果是一個整數,所以小數部分被截斷。

序列列是組內的行號,由CreateDate按升序排列。因此,每個組中最早的日期將爲序列1.

主要查詢包括WHERE sequence = 1,這表示您想要查看每個組中的第一行。

當你準備刪除不需要的行,你會改變像下面的主查詢:

WITH cte AS 
    (SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, 
     DATEDIFF(ss, '1/1/2000', CreateDate)/30 AS CreateDateGroup, 
     ROW_NUMBER() OVER (PARTITION BY UserID, ActorID, ActorType, BoxID, Query, 
            DATEDIFF(ss, '1/1/2000', CreateDate)/30 
          ORDER BY CreateDate ASC) AS sequence 
    FROM TrackingLog 
    ) 

DELETE 
FROM cte 
WHERE sequence > 1 
; 

這個命令會從表中刪除不屬於每個組的第一行中的所有行。

0

按除時間戳以外的所有字段進行分組並取max(timestamp_field)值?

相關問題