0

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

int UserID, int ActorID, nvarchar(50) ActorType, int BoxID, 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

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

4

2 回答 2

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 值转换为自“2000 年 1 月 1 日”以来的秒数,然后除以 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
;

此命令将从表中删除不是每个组的第一行的所有行。

于 2010-09-17T22:10:21.893 回答
0

按除时间戳以外的所有字段分组并取 max(timestamp_field) 值?

于 2010-09-17T19:07:58.900 回答