删除表中具有两个相同列值的记录

时间:2014-01-08 19:18:43

标签: sql sql-server sql-server-2008

我有一张这样的表:

Location   E-Mail            Name          Language      Creation Time
-----------------------------------------------------------------------
D          max@gmx.net       Max           de            19:06:00  <-- A
D          peter@outlook.com Peter         en            19:10:00
D          lisa@google.com   Lisa          en            17:39:00
E          tom@hotmail.com   Tom           fr            05:00:00  <-- B
E          carl@gmx.net      Carl          en            09:01:00
D          max@gmx.net       Max           en            17:45:00  <-- A
D          max@gmx.net       Mike          de            17:45:00  <-- A
E          tom@hotmail.com   Tom           de            06:00:00  <-- B

我想识别LocationE-Mail相同的每条记录,删除“重复”并保留最新记录。如果创建时间相同(A),则无关紧要,删除哪条记录。

结果表应为:

Location   E-Mail            Name          Language      Creation Time
-----------------------------------------------------------------------
D          peter@outlook.com Peter         en            19:10:00
D          lisa@google.com   Lisa          en            17:39:00
E          tom@hotmail.com   Tom           fr            05:00:00  <-- B
E          carl@gmx.net      Carl          en            09:01:00
D          max@gmx.net       Mike          de            17:45:00  <-- A

由于表格很长,解决方案应该很快。 : - )

感谢您的每一个提示!

干杯,霍尔格

1 个答案:

答案 0 :(得分:6)

如果你使用的是SQL Server 2005及更新版本(在这方面你不够具体),一种方法是使用CTE(公用表表达式)。

使用此CTE,您可以按照某些条件对数据进行分区 - 即(Location, EMail) - 并为每个“分区”提供从1开始的所有行的SQL Server编号,按降序排列{{1 }}

所以尝试这样的事情:

CreationTime

在这里,我只为每个“分区”(即每个;WITH NewestData AS ( SELECT Location, EMail, Name, Language, CreationTime, RowNum = ROW_NUMBER() OVER(PARTITION BY Location, EMail ORDER BY CreationTime DESC) FROM dbo.YourTableNameHere ) DELETE FROM NewestData WHERE RowNum > 1 元组)选择“第一个”(最新)条目 - 由(Location, EMail)按降序排序。

因此,每个CreationTime元组的最新条目的(Location, EMail)值为1,任何“重复”的值都大于RowNum - 所以我只是删除远离所有那些“重复” - 你已经完成了!