Oracle删除'重复'基于时间戳中的秒数的行

时间:2016-04-07 15:16:56

标签: oracle

希望这是有道理的......

我们在代码中发现了一个错误,即重复记录+ 1秒,因此我们慢慢看到以下数据累积起来。

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 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秒)

1 个答案:

答案 0 :(得分:2)

如果您想要任何连续值序列中的最后一行,即使它们跨越一个分钟边界,您也可以删除任何后面一秒钟的值。每个组中的最后一个条目不会有连续的下一行(否则它不会成为组的结尾),因此保留。

使用您的示例数据加上评论中跨越04:13:00边界的三个额外行,所以共有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