1

我有一个表 Department_history ,这是每个部门的记录数。

select department_name, Id, count(1) total_rows_COUNT from Department_history
where 
group by Department_history,id
order by 2 desc

结果:

department_name         ID     total_rows_COUNT 
Accounting            4564     556
Finance               3434     671
Marketing             4353  234
IT                  1233    454

我只想保留表中每个部门的 10 条记录。

如果像这样为每个部门运行下面的查询,它就可以工作。

delete from Department_history a1 
where 
and a1.report_runtime NOT IN
(
   select report_runtime
   from (
       select a.*, rank() over ( partition by department_name, id  order by report_runtime desc) r
       from Department_history a
    ) rs
     where r <= 10 and department_name = 'Accounting'

)
and department_name = 'Accounting'

但我不想为每个部门单独运行此删除操作。如何运行一个查询来删除每个部门名称的数据(如果它是 >10 条记录)。我试试这个。但它不起作用。

delete from Department_history a1 
where 
and a1.report_runtime NOT IN
(
   select report_runtime
   from (
       select a.*, rank() over ( partition by department_name, id  order by report_runtime desc) r
       from Department_history a
    ) rs
     where r <= 10 

)

有人可以建议吗?

4

2 回答 2

0

尝试这个。它与您已经尝试过的类似,但该not in子句应该检查所有 3 个标识列,department_name, id, report_runtime而不仅仅是report_runtime. 否则,您可能会不小心删除错误的行。

我也用row_number了代替rank。我认为这是满足您要求的更好选择。尽管根据您对数据的描述,我认为在这种情况下实际上并没有什么不同。

delete from department_history
 where (department_name, id, report_runtime)
   not in (select department_name, id, report_runtime
             from (select department_name, id, report_runtime,
                          row_number() over (partition by department_name, id order by report_runtime desc) as rn
                     from department_history)
            where rn <= 10)
于 2015-10-31T17:42:25.800 回答
0

测试样品:

create table tst as select owner, view_name from all_views;

delete from tst
  where owner||'::'||view_name in
(  
select owner||'::'||view_name from (
select owner, view_name, rank() over (partition by owner order by view_name) r from tst
) where r > 10
)

您更新的 sql:

delete from Department_history
where id NOT IN
(
   select id
   from (
       select id, rank() over ( partition by department_name  
order by report_runtime desc) rnk
from Department_history
    ) s
     where s.rnk <= 10    
)
于 2015-10-30T21:34:24.920 回答