2016-04-07 3 views
0

希望を秒に基づいて「複製」の行を削除する私たちは、+ 1秒の記録を複製して我々のコードにバグを発見したので、私たちはゆっくりと次のデータが蓄積見ていました。Oracleは</p> <p>...これは理にかなって、タイムスタンプに

DATE 
----------------------------- 
07-DEC-15 04.12.53.000000000 
07-DEC-15 04.12.54.000000000 
07-DEC-15 04.12.55.000000000 
07-DEC-15 04.12.56.000000000 
07-DEC-15 04.12.57.000000000 
07-DEC-15 04.12.58.000000000 
07-DEC-15 04.12.59.000000000 

07-DEC-15 10.12.54.000000000 
07-DEC-15 10.12.55.000000000 
07-DEC-15 10.12.56.000000000 
07-DEC-15 10.12.57.000000000 
07-DEC-15 10.12.58.000000000 
07-DEC-15 10.12.59.000000000 

07-DEC-15 16.12.55.000000000 
07-DEC-15 16.12.56.000000000 
07-DEC-15 16.12.57.000000000 
07-DEC-15 16.12.58.000000000 
07-DEC-15 16.12.59.000000000 

07-DEC-15 22.12.56.000000000 
07-DEC-15 22.12.57.000000000 
07-DEC-15 22.12.58.000000000 
07-DEC-15 22.12.59.000000000 

私たちは、バグを修正したが、現在は各「重複」のため1つのレコードが、すべてを削除する必要があり、この場合には(最新値 を維持するためにDD-MMM-YYのDATEが決定されたていますXX:XX:59秒)ので、私たちはこの

DATE 
----------------------------- 
07-DEC-15 04.12.59.000000000 

07-DEC-15 10.12.59.000000000 

07-DEC-15 16.12.59.000000000 

07-DEC-15 22.12.59.000000000 

で終わる注:このデータは6時間おきに来る ので、我々は 行1、行2、行3、行4

が表示されます

しかし、私たちが得たバグのために

row1 
row1,row1,row2 
row1,row1,row1,row2,row2,row3 
row1,row1,row1,row1,row2,row2,row2,row3,row3 
etc 

新しい行ごとに+1秒です。私たちのディスプレイは秒を表示しません(なぜか分かりません)ので、重複したデータとして表示されます(技術的には1秒のために表示されません)。

+0

いつも59で終わるのではなく、次の分にロールオーバーされたレコードのグループがありますか?そうであれば、それらをどのように処理する必要がありますか?グループは秒が常に連続していますか?グループ間には少なくとも1秒のギャップがありますか? –

+0

TIMEは04:13:00、04:13:01、04:13:02などにロールオーバーします。これはOKと受け入れています。私たちは最後の結果の5行目として04:13:02を持っています。 – Casper

+0

別のエントリとして、たとえそれがリストの最初の7つのレコードと連続していたとしても?あなたは実際に両方の記録を望んでいるのですか、あるいはあなたに選択肢がないと思いますか? –

答えて

2

連続した値1分後に値を持つものを削除することができます。各グループの最後のエントリは連続した次の行を持ちません(それ以外の場合はグループの最後ではありません)。あなたのサンプルデータプラス4時13分○○秒境界を越えあなたのコメントから3つの余分な行、すべてで非常に25行を持つ

delete from your_table t1 where exists (
    select null from your_table t2 
    where t2.ts = t1.ts + interval '1' second 
); 

21 rows deleted. 

select * from your_table; 

TS       
---------------------------- 
07-DEC-15 04.13.02.000000000 
07-DEC-15 10.12.59.000000000 
07-DEC-15 16.12.59.000000000 
07-DEC-15 22.12.59.000000000 

あなたは分の境界にまたがるレコードが扱われることをしたい場合彼らは連続している場合でも、別のグループとして、あなたは分レベルのフィルタを含めることができます。

delete from your_table t1 where exists (
    select null from your_table t2 
    where t2.ts = t1.ts + interval '1' second 
    and trunc(t2.ts, 'MI') = trunc(t1.ts, 'MI') 
); 

20 rows deleted. 

select * from your_table; 

TS       
---------------------------- 
07-DEC-15 04.12.59.000000000 
07-DEC-15 04.13.02.000000000 
07-DEC-15 10.12.59.000000000 
07-DEC-15 16.12.59.000000000 
07-DEC-15 22.12.59.000000000 

あなたはIDのような他の関連する列を持っている場合は、いずれにももちろん参加することを含めることができます。

最後の代わりに各グループの開始を希望する場合は、+ interval '1' secondから- interval '1' secondに変更してください。

+0

データとそれは我々が必要とするようにしているように見える!適切にマークアップしてくれてありがとう。 – Casper

+1

偉大な答え。非常に良い説明とストレートなソリューション。 –

+0

これは、rowid