【问题标题】:Delete data based on the count & timestamp using pl\sql使用 pl\sql 根据计数和时间戳删除数据
【发布时间】:2020-08-18 10:37:57
【问题描述】:

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

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

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

同样的匹配数据也应该从参考表中删除。

请有人帮助我解决这个问题。谢谢。

enter image description here

主表

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    您应该能够将每个表删除作为单个 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)
    

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2021-02-06
      • 2017-01-23
      • 2022-10-14
      相关资源
      最近更新 更多