SQL Server 2008:删除重复的行

Fea*_*hal 10 sql duplicates sql-server-2008

我的表中有重复的行,如何根据单个列的值删除它们?

例如

uniqueid, col2, col3 ...
1, john, simpson
2, sally, roberts
1, johnny, simpson

delete any duplicate uniqueIds
to get 

1, John, Simpson
2, Sally, Roberts
Run Code Online (Sandbox Code Playgroud)

Har*_* CO 35

你可以DELETE从cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1
Run Code Online (Sandbox Code Playgroud)

ROW_NUMBER()函数为每一行分配一个数字. PARTITION BY用于为该组中的每个项目开始编号,在这种情况下,每个值uniqueid将从1开始编号并从那里开始. ORDER BY确定数字进入的顺序.由于每个uniqueid数字从1开始编号,任何ROW_NUMBER()大于1的记录都有重复uniqueid

要了解ROW_NUMBER()函数的工作原理,请尝试一下:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Run Code Online (Sandbox Code Playgroud)

您可以调整ROW_NUMBER()函数的逻辑以调整要保留或删除的记录.

例如,您可能希望通过多个步骤执行此操作,首先删除具有相同姓氏但名字不同的记录,您可以将姓氏添加到PARTITION BY:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1
Run Code Online (Sandbox Code Playgroud)

  • 这是最干净的方法. (3认同)