在多个列上进行匹配时,SQL会删除重复的行

时间:2014-04-17 03:10:06

标签: sql-server-2005

我必须清理一个从来没有主键或外键的旧表,其中包含数百行重复数据。我已经看到很多关于如何在仅使用一列时从表中删除的示例,但我不了解如何扩展示例以包含两个可能的三个必要列。

表数据基本上如下所示:

 Id     Person    Date
 1      12        3/12/2014
 1      12        3/12/2014

我认为以下似乎是实现我的目标的好方法,但它没有返回任何结果。我怎样才能最有效地实现这一目标?如果我能提供帮助,我不想重新创建表格。

 WITH cte AS (
     SELECT Id, Person, Date,
     row_number() OVER(PARTITION BY Id,Person,Date ORDER BY Id) AS rn
 FROM dbo.mytable
 )
 DELETE cte WHERE rn > 1

1 个答案:

答案 0 :(得分:0)

您应该按相同的列列表排序和分区。这样,对于所有唯一组合,行号将重新启动。

WITH cte AS (
     SELECT Id, Person, Date,
     row_number() OVER(PARTITION BY Id,Person,Date ORDER BY Id,Person,Date) AS rn
 FROM dbo.mytable
 )
 DELETE cte WHERE rn > 1