Oracle大数据审计表连续记录分组

Group By on Consecutive Records for audit tables which has huge data in Oracle

我在oracle中有一个审计table,它的数据增长非常快,已经变得非常大 看起来我已经决定通过不审核 'CALLED_TIME' 列来缩短它。

所以我需要从审计 table 中删除为 CALLED_TIME 记录审计的记录,稍后我想从我的 table 中删除 CALLED_TIME 列(这是容易)让它不再被记录下来。

如果能列出要删除的REV就更好了

数据在table之前

REV     CALLED_TIME             REVTYPE DATA1   DATA2   DATA3
239402  2014-08-20 20:48:20     0       12122   4       22
239403  2014-08-20 20:52:17     1       12122   4       22
239404  2014-08-20 20:52:58     1       12122   4       22
239405  2014-08-20 20:53:13     1       12122   4       22
239406  2014-08-20 20:53:13     1       12122   4       223
239407  2014-08-20 21:02:05     1       12122   4       223
239408  2014-08-20 21:02:39     1       12122   4       223
239409  2014-08-20 21:04:22     1       12122   4       223
239410  2014-08-20 21:27:53     1       12122   4       223
239411  2014-08-20 21:28:51     1       12122   4       223
239412  2014-08-20 21:29:50     1       12122   4       223
239413  2014-08-20 21:29:50     1       12122   43      223
239414  2014-08-20 21:46:19     1       12122   43      223
239415  2014-08-20 21:46:51     1       12122   43      223
239416  2014-08-20 21:53:08     1       12122   43      223
239417  2014-08-20 22:00:45     1       12122   43      223
239418  2014-08-20 22:01:26     1       12122   43      223
239419  2014-08-20 22:23:01     1       111141  43      223
239420  2014-08-20 22:23:48     1       111141  43      223
239421  2014-08-20 22:32:11     1       111141  43      223
239422  2014-08-20 22:44:42     1       111141  43      223
239423  2014-08-20 22:46:38     1       111141  43      223
239414  2014-08-20 22:55:33     2       111141  43      223

输出应该类似于

REV     CALLED_TIME             REVTYPE DATA1   DATA2   DATA3
239402  2014-08-20 20:48:20     0       12122   4       22
239406  2014-08-20 20:53:13     1       12122   4       223
239413  2014-08-20 21:29:50     1       12122   43      223
239419  2014-08-20 22:23:01     1       111141  43      223
239414  2014-08-20 22:55:33     2       111141  43      223

我已经看过很多相关的解决方案,但我选择的是加入 table 两次,因此变得非常懒惰。

从您的样本数据来看,您似乎想要删除大部分记录。因此,在这种情况下,最好的方法是使用要保留的数据创建 table,然后只删除原始 table.

create table temp_audit as 
     select * from (
         select t.*
                , row_number() over (partition by REVTYPE, DATA1, DATA2, DATA3
                                     order by CALLED_TIME asc) rn
          from orig_audit
              )
     when rn = 1;

那你需要把原来的table推掉,代入保留的table。最快的方法可能是:

drop table orig_audit;
rename temp_audit to orig_audit;

但是如果您有很多索引、授权、外键要恢复,那可能不会那么快。备择方案?如果您没有引用 table 的外键,那么这将起到作用 ...

truncate table  orig_audit;
insert into orig_audit
     select * from temp_audit;

...否则...

delete from orig_audit;
insert into orig_audit
     select * from temp_audit;