2016-10-24 8 views
1

私は、cols:id、timestamp、col1..col70 +および最大400万行の27個のマシンプロセスデータテーブルを持っています。 サンプルレートが10秒あたり1から30秒に1に変更されました。 どのような行のタイムスタンプが以前の時間的タイムスタンプの21秒以内に(各行のサンプルレートを効果的に1/30秒に変更する)、各テーブル内の行を(個別に)削除するにはどうすればよいですか? "id"または "timestamp"が任意の順序であると仮定しないでください。外部キーはありません。 "id"はIDおよび主キー列です。 これらは、非リレーショナルの履歴データテーブルです。 これは、例として1つの表の一部の行です。 サンプル間隔の早い段階では10秒、今では30秒です。SQL - 前の行の時間間隔内の行を削除する

id  Timestamp 
949046 2015-03-02 02:54:49.740 --(arbitrarily starting here) 
949047 2015-03-02 02:54:59.757 --delete - within 21 secs of 949046 
949048 2015-03-02 02:55:09.757 --delete - within 21 secs of 949046 
949049 2015-03-02 02:55:19.757 --keep - > 21 secs from 949046 
949050 2015-03-02 02:55:29.727 --delete - within 21 secs of **949049** 
949051 2015-03-02 02:55:39.727 --delete - within 21 secs of 949049 
949052 2015-03-02 02:55:49.743 --keep - > 21 secs from 949049 
949053 2015-03-02 02:55:59.727 --delete - within 21 secs of **949052** 
. 
. 
3370919 2016-10-22 10:26:23.510 --keep assuming > 21 secs from previous row 
3370920 2016-10-22 10:26:53.570 --keep - > 21 secs from 3370919 
3370921 2016-10-22 10:27:23.617 --keep - > 21 secs from 3370920 
+0

すでにそこにあるデータでは、すべての行のタイムスタンプ値が前回の21秒よりも短くなります。あなたがしなければならないことは、2番目のものの価値を守りたいものと捨てたいものを決めることです。同じidと同じ分の値を持つレコードの各セットと同様に、0〜29の秒値と30〜59の値の1つの行のみを保持します。 –

+0

チャールズ、 - dateaddのmm(月)がオーバーフローを引き起こします。 mi(分)を意味していて、機能の「分」ではないですか? – Exeter

+0

私はSQLの「知っている」ことは、あなたがこれらの質問に答えてくれるからです。私は多くの事を行うことができます。実際には必要なものすべて(空隙や島を見つけて説明したり、他のテーブルから欠落したデータを挿入するなど)をすることができます。 – Exeter

答えて

0

だから、オープンこれが残らないように、これは私がテストテーブルとSQL Server 2012のようTTを使用して思い付いたものです:

Drop table TT 
Select *, row_number() over (order by timestamp) RN 
into TT 
from MyTable 

COLは、主キー列を(RN作る実行時間を落としました)30+倍

ループソリューション:

declare @LowWindow datetime = (Select timestamp from TT where RN=1), 
    @HiWindow datetime = (dateadd(ss,21,(Select timestamp from TT where RN=1))), 
    @MaxLoop int = (select top (1) count(id) from TT), 
    @LoopCount int = 1 

Loop1: 

if ((select timestamp from TT where RN = @LoopCount+1) > @LowWindow and (select timestamp from TT where RN = @LoopCount+1)< @HiWindow) 
    Begin 
     Delete from TT where rn = @LoopCount + 1 
     Set @LoopCount = @LoopCount + 1 
    End 

Else 
    begin 
     set @LoopCount = @LoopCount + 1 
     set @LowWindow = (select timestamp from TT where RN = @LoopCount) 
     set @HiWindow = (dateadd(ss,21, @LowWindow)) 
    end 

if (@LoopCount > @Maxloop) 
    goto EndQuery 
Else 
    GOTO Loop1 

EndQuery: 

コルRN FをからのPK制約を削除し、削除しますROM TT、MyTableをTTに置き換え、MyTableのcol IDのPK制約を元に戻します。

3,367,000行、980MBのテーブルで1時間54分実行しました。 気軽にコメントしてください。

私は、セット理論の解を見たいと思っています!

0

の間で試しましたか?

DECLARE @vdate VARCHAR(24); 

SELECT @vdate=CONVERT(VARCHAR(10),TimeStamp,103)+' '+CONVERT(VARCHAR(5),TimeStamp,108)+':30'; 

DELETE FROM TABLE WHERE TimeStamp BETWEEN @TimeStampCurrent AND @vdate 
+0

クリスチャン、私は@TimeStampCurrentを何に設定するのですか?そして、選択したものは何ですか? – Exeter

+0

@TimeStampCurrentは、分になります。 (TimeStamp)。 –

+0

@TimeStampCurrent = timestamp FROM table WHERE(あなたの条件); –

関連する問題