Oracle 根据计数删除数据&;使用pl\sql的时间戳

Oracle 根据计数删除数据&;使用pl\sql的时间戳,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我是PL\SQL编程新手,有DBA背景。我需要从主表和参考表中删除数据,但在删除数据时需要遵循以下逻辑,因为我们需要从表中删除3000万数据,所以我们正在根据下面的“State_ID”列减少数据 需要考虑的下列条件 1.根据下面给出的示例数据(主表),使用desc order根据时间戳对数据进行排序,并保留每个“State_id”的前2行数据,并根据“State_id”列从两个表中删除其余数据。 2.从maintable group by state_id order by timestamp

我是PL\SQL编程新手,有DBA背景。我需要从主表和参考表中删除数据,但在删除数据时需要遵循以下逻辑,因为我们需要从表中删除3000万数据,所以我们正在根据下面的“State_ID”列减少数据

需要考虑的下列条件 1.根据下面给出的示例数据(主表),使用desc order根据时间戳对数据进行排序,并保留每个“State_id”的前2行数据,并根据“State_id”列从两个表中删除其余数据。 2.从maintable group by state_id order by timestamp desc have count()>2中选择state_id,count()

因此,如果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)