使用 pl\sql 根据计数和时间戳删除数据



我是PL\SQL编程的新手,有DBA背景。我有一个要求,即从主表和引用表中删除数据,但在删除数据时需要遵循以下逻辑,因为我们需要从表中删除30M的数据,因此我们正在根据下面的"State_ID"列减少数据。

需要考虑以下条件1.根据下面给出的样本数据(主表(,根据时间戳和desc顺序对数据进行排序,并为每个"State_id"保留前2行数据,并根据"State_id"列从两个表中删除其余数据。2.按state_id顺序按时间戳desc从主表组中选择state_id,count((大于2;

因此,如果state_id=1有5行,则必须删除3行数据,将前2行留给state_id=1,并对其他state_id值重复。

同样,同样的匹配数据也应该从引用表中删除。

请有人在这个问题上帮助我。谢谢

在此处输入图像描述

主表

您应该能够将每个表删除作为一个SQL命令。任何其他操作都会强制逐行处理,这是您最不希望看到的数据量。类似这样的东西:

delete from main_table m
where m.row_id not in (
with keep_me as (
select row_id, 
row_number() over (partition by state_id 
order by time_stamp desc) id_row_number 
from main_table where id_row_number<3)
select row_id from keep_me)

delete from main_table m 
where m.row_id in (
with delete_me as (
select row_id, 
row_number() over (partition by state_id 
order by time_stamp desc) id_row_number 
from main_table where id_row_number>2)
select row_id from delete_me)

最新更新