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

时间:2016-03-26 21:00:41

标签: sql sql-server greatest-n-per-group sql-delete

我有这个表和三列(ID,电子邮件,[最后更新]。

我想删除重复的电子邮件,但保留上次更新的行(按日期条件)。在此示例中,aaa是重复的。它在2011年有1排,2014年有其他。我想保留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

4 个答案:

答案 0 :(得分:2)

在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

答案 1 :(得分:1)

使用以下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根据需要。

答案 2 :(得分:1)

您没有告诉我们您使用的是哪个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 :(得分:0)

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

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];