Sql server 2005 删除datetime列值彼此相差不超过秒的所有重复行(只有一行除外)?

Sql server 2005 删除datetime列值彼此相差不超过秒的所有重复行(只有一行除外)?,sql-server-2005,datetime,duplicate-removal,Sql Server 2005,Datetime,Duplicate Removal,由于系统中的一个错误,一个跟踪日志被反复触发,导致原本应该是一个日志条目的内容实际上有数百个。这已经解决了,但数据仍然存在,需要报告(我不能全部删除)。但是,我只需要数据的一个实例。这将是一个棘手的问题,我认为,以下是表中的相关字段: intuserid、intactorid、nvarchar(50)ActorType、intboxid、datetime CreateDate、nvarchar(50)查询 现在,对于每一行,其中所有行都是相同的,CreateDate中的差异都在30秒内,我想删除

由于系统中的一个错误,一个跟踪日志被反复触发,导致原本应该是一个日志条目的内容实际上有数百个。这已经解决了,但数据仍然存在,需要报告(我不能全部删除)。但是,我只需要数据的一个实例。这将是一个棘手的问题,我认为,以下是表中的相关字段:

intuserid、intactorid、nvarchar(50)ActorType、intboxid、datetime 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

但我只保留一个,我希望这是足够的信息。

按除时间戳以外的所有字段分组,并取最大值(时间戳字段)

以下是如何从按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

主查询包括
其中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
;
此命令将删除表中不是每组第一行的所有行