删除重复行但保留最早的行(按日期标准) - SQL Server

Posted

技术标签:

【中文标题】删除重复行但保留最早的行(按日期标准) - SQL Server【英文标题】:Delete duplicate rows but keep the earliest row (by date criteria) - SQL Server 【发布时间】:2016-03-26 21:00:41 【问题描述】:

我有这张表和三列(ID、电子邮件、[上次更新]。

我想删除重复的电子邮件,但保留最后更新的行(按日期标准)。在此示例中,aaa 是重复的。它在 2011 年和 2014 年有 1 行。我想只保留 2014 年。

ID       Email          Last update         
a-4        aaa           10/01/2011 
b-1        bbb           10/02/2012    
k-1        ccc           05/03/2013    
d-9        aaa           10/08/2014
t-7        bbb           02/09/2015

【问题讨论】:

您使用的是哪个 sql server?甲骨文?女士 sql?我的 sql? 我认为注册意味着记录。 【参考方案1】:

在 SQL Server 中,您可以使用CTE 来执行DELETE

;WITH ToDelete AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY Email         
                             ORDER BY [Last update] DESC) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1

【讨论】:

【参考方案2】:

您没有告诉我们您使用的是哪个 DBMS,但以下是 ANSI SQL,应该适用于所有(现代)DBMS:

delete from the_table
where exists  (select id
               from the_table t2
               where t2.email = the_table.email
                 and t2.id <> the_table.id
                 and t2.last_update > the_table.last_update);

SQLFiddle:http://sqlfiddle.com/#!15/ca442/1

【讨论】:

【参考方案3】:

使用以下 SQL 语句:

SELECT First(ID) AS Id, First(Email) AS Email, Max([Last update]) AS LastUpd
FROM YourTable
GROUP BY Email
ORDER BY Max([Last update]) DESC;

必要时MAKE TABLE

【讨论】:

【参考方案4】:

删除电子邮件字段的重复记录:

DELETE a FROM MyTable a INNER JOIN (
  SELECT Email, MAX([Last Update]) [Last Update]
  FROM MyTable
  GROUP BY Email
) b ON a.Email = b.Email AND a.[Last Update] <> b.[Last Update];

【讨论】:

以上是关于删除重复行但保留最早的行(按日期标准) - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

删除mysql查询python结果的行但不从数据库中删除

SQL中删除重复的行(重复数据),只保留一行 转

SQL 查询 - 组合两个表,删除重复项并仅保留最新的日期

SQL Server - 如何使部分重复的行从原始行继承值

删除 SQL 中的重复行

一条SQL删除重复记录,重复的只保留一条