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;
我在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;