9

ID (uniqueidentifier)、Observation (nvarchar)、Timestamp (datetimeoffset) の 3 つの列を持つテーブルをクリーンアップする必要があります。コンテンツは 1 時間間隔で 2 つのセンサーによって生成され、Observation の値は 2 つのセンサーから同じです。私の考えは、次のようなSELECTクエリを実行することです

SELECT * FROM [Records] ORDER BY [Timestamp]

次に、すべての行を交互に削除します。

SO でこれを見つけました access table のすべての代替行を削除する方法ですが、ID は Int ではなく UID であるため、ここでは実際には適用されません。

データのサンプルは次のようになります。

ここに画像の説明を入力

4

4 に答える 4

18

SQL Server 2005 以降を使用している場合は、次のようなことができます。

delete T
from (
       select row_number() over(order by [Timestamp]) as rn
       from YourTable
       where SomeColumn = @SomeValue
     ) T
where T.rn % 2 = 0
于 2012-08-13T09:05:12.433 に答える
3

代替レコードを削除する代わりに、より安全なバリエーションを使用できます。データにエラーが発生した場合に同期が外れないように、重複した観測のみを削除します。

; with cte as (
  select *,
         row_number() over (partition by Observation 
                            order by [Timestamp]) rn
    from [Records]
)
delete cte
 where rn > 1
于 2012-08-13T09:09:30.080 に答える
1

私が間違っていなければ、row_number() で CTE を使用して、一時的な数値 ID 列を効果的に生成できます。次に、同じアイデアを適用できます - 行番号 mod 2 が 0 の場所を削除します。

;WITH temp
     AS (SELECT *,
                Row_number() OVER (ORDER BY [Timestamp]) rn
         FROM   [Records]
         ORDER  BY [Timestamp])
DELETE FROM temp
WHERE  rn % 2 = 0
于 2012-08-13T09:05:19.893 に答える
1

2 つの数値を除算して剰余を返す MOD 演算子を使用してこれを行うことができます。

試す

DELETE FROM [Records] WHERE ([ID] Mod 2)=0)

ループ内に入れて、すべての代替行を削除します

例えば

ID = 0;
rows = get_number_of_rows_in_the_table;
i = 0; // counter
while(i<rows) {
ID = get the ID of row 0
if(ID MOD 2 = 0) {
//perform delete operation
DELETE FROM [Records] WHERE ID=the ID you just got;
} else { 
increment the counter 
i++
}

これは1つの解決策ですが、アクセスの正しい構文ではありません

于 2012-08-13T09:10:32.740 に答える