根据最大日期/时间删除Oracle中的重复记录

问题描述 投票:0回答:2

我有以下包含重复信息的示例数据:

ID   Date                 Emp_ID    Name    Keep
---------------------------------------------------------
1    17/11/2010 13:45:22  101       AB      *
2    17/11/2010 13:44:10  101       AB
3    17/11/2010 12:45:22  102       SF      *
4    17/11/2010 12:44:10  102       SF
5    17/11/2010 11:45:22  103       RD      *
6    17/11/2010 11:44:10  103       RD        

根据上述数据集,如何删除重复的 Emp ID 并仅保留指定了最大日期/时间的 Emp ID?

所以根据上述内容,我只会看到 ID:1、3 和 5。

sql plsql oracle10g
2个回答
6
投票

类似:

从没有名称的表中删除
WHERE date_column != (SELECT MAX(t2.date_column)
                      来自 the_table_with_no_name t2
                      WHERE t2.id = the_table_with_no_name.id);

2
投票

您可以生成除最大日期行(对于给定的 EMPId)之外的所有行的 ROWID 并删除它们。我发现这是一种高性能的方法,因为它是一种基于集合的方法并使用分析、rowID。

--get list of all the rows to be deleted.

select row_id from (
select rowid row_id,
       row_number() over (partition by emp_id order by date desc) rn
  from <table_name>
) where rn <> 1

然后删除行。

delete from table_name where rowid in (
    select row_id from (
    select rowid row_id,
           row_number() over (partition by emp_id order by date desc) rn
      from <table_name>
    ) where rn <> 1
);
© www.soinside.com 2019 - 2024. All rights reserved.