删除重复行但保留最早的行(按日期标准) - 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的主要内容,如果未能解决你的问题,请参考以下文章