如何在SQL中找到重复的条目并删除最旧的条目?

时间:2009-03-25 01:01:25

标签: sql sql-server

我有一个表,除了一列中的一个值外,它们都是唯一的行(我们称之为'Name')。另一列是'Date',它是添加到数据库的日期。

我想要做的是在“名称”中找到重复的值,然后删除“日期”中具有最早日期的那些,留下最新的日期。

看起来像一个相对简单的查询,但除了简单的查询之外,我对SQL知之甚少。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

从表a1中删除 存在的地方(从表a2中选择*,其中a2.name = a1.name和a2.date> a1.date)

答案 1 :(得分:5)

查找重复项并删除最旧的

alt text

这是代码

create table #Product (
    ID      int identity(1, 1) primary key,
    Name        varchar(800),
    DateAdded   datetime default getdate()
)

insert  #Product(Name) select 'Chocolate'
insert  #Product(Name,DateAdded) select 'Candy', GETDATE() + 1
insert  #Product(Name,DateAdded) select 'Chocolate', GETDATE() + 5
select * from #Product

;with Ranked as (
    select  ID, 
        dense_rank() 
        over (partition by Name order by DateAdded desc) as DupeCount
    from    #Product P
)
delete  R
from    Ranked R
where   R.DupeCount > 1

select * from #Product

答案 2 :(得分:0)

您可以使用自连接和IS NOT NULL来实现此目的。

加入DELETE查询可能有点危险,因为它越复杂,在某些情况下删除的风险就越大。

但我会接近它。

DELETE
  a.*
FROM
  mytable AS a
  LEFT JOIN mytable AS b ON
    b.date > a.date
    AND (b.name=a.name OR (b.date = a.date AND b.rowid>a.rowid))
WHERE
  AND b.rowid IS NOT NULL

join和IS NOT NULL查找存在具有相同名称的较新行的每一行。它还处理两行具有相同日期的情况 - 如果它们具有相同的日期,那么它将通过rowid(无论是什么)。

希望这样的事情有效。

答案 3 :(得分:0)

我刚刚在Google上搜索并发现了这个https://www.sqlshack.com/different-ways-to-sql-delete-duplicate-rows-from-a-sql-table/

对我来说,这似乎是最容易阅读/理解的

DELETE FROM [SampleDB].[dbo].[Employee]
    WHERE ID NOT IN
    (
        SELECT MAX(ID) AS MaxRecordID
        FROM [SampleDB].[dbo].[Employee]
        GROUP BY [FirstName], 
                 [LastName], 
                 [Country]
    );

在您的情况下,您可以按名称分组并选择最大日期而不是ID