删除基于列上相同值的重复记录并保持最新

时间:2009-07-23 23:33:28

标签: sql sql-server

我想删除基于它们在某个列中具有相同值的重复记录,并在下面的示例中保留一个基于InsertedDate的最新记录。我想要一个不使用游标但基于设置的解决方案。目标:删除所有重复项并保持最新状态。

下面的ddl创建了一些重复项。需要删除的记录是:John1& John2因为他们与John3具有相同的ID而John3是最新的记录。

同时记录John5需要删除,因为还有另一条ID为3且更新的记录(John6)。

Create table dbo.TestTable (ID int, InsertedDate DateTime, Name varchar(50))

Insert into dbo.TestTable Select 1, '07/01/2009', 'John1'
Insert into dbo.TestTable Select 1, '07/02/2009', 'John2'
Insert into dbo.TestTable Select 1, '07/03/2009', 'John3'
Insert into dbo.TestTable Select 2, '07/03/2009', 'John4'
Insert into dbo.TestTable Select 3, '07/05/2009', 'John5'
Insert into dbo.TestTable Select 3, '07/06/2009', 'John6'

2 个答案:

答案 0 :(得分:4)

就像学术活动一样:

with cte as (
   select *, row_number() over (partition by ID order by InsertedDate desc) as rn
   from TestTable)
delete from cte
where rn <> 1;

大多数时候,Sam提出的解决方案表现得更好。

答案 1 :(得分:2)

这有效:

delete t 
from TestTable t
left join 
(
    select id, InsertedDate = max(InsertedDate) from TestTable
    group by id
) as sub on sub.id = t.id and sub.InsertedDate = t.InsertedDate
where sub.id is null

如果你必须处理关系,它会变得有点棘手。