2010-09-17 44 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)值?

相关问题