0

システムのエラーが原因で、追跡ログが繰り返し発生し、1つのログエントリであるはずだったものが実際には数百になりました。これは解決されましたが、データはまだ存在しており、レポート用にする必要があります(すべてを削除することはできません)。ただし、データのインスタンスは1つだけ必要です。これは難しいと思います。表の関連フィールドは次のとおりです。

int UserID、int ActorID、nvarchar(50)ActorType、int BoxID、datetime CreateDate、nvarchar(50)クエリ

ここで、これらすべてが同一であり、CreateDateの差が互いに30秒以内であるすべての行について、1つを除くすべての行を削除したいと思います。

したがって、リストされたフィールドのすべてのデータは完全に一致し、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つだけ保持します、それが十分な情報であることを願っています。

4

2 に答える 2

1

30秒の範囲でグループ化されたレコードの各グループから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
    )

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

Common Table Expression(CTE)では2つの列が生成されます。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
;

このコマンドは、各グループの最初の行ではないすべての行をテーブルから削除します。

于 2010-09-17T22:10:21.893 に答える
0

タイムスタンプを除くすべてのフィールドでグループ化し、max(timestamp_field)値を取得しますか?

于 2010-09-17T19:07:58.900 に答える