如何使用OVER子句删除SQL Server中的重复行?

时间:2013-04-24 15:19:02

标签: sql sql-server tsql

以下是我表格中的列:

Id
EmployeeId
IncidentRecordedById
DateOfIncident
Comments
TypeId
Description
IsAttenIncident

我想删除EmployeeId, DateOfIncident, TypeIdDescription相同的重复行 - 只是为了澄清 - 我确实希望保留其中一行。我想我应该在OVER使用PARTITION子句,但我不确定。

由于

3 个答案:

答案 0 :(得分:16)

如果您想保留一行重复组,可以使用ROW_NUMBER。在此示例中,我将行保留为最低Id

WITH CTE AS 
(
    SELECT rn = ROW_NUMBER() 
                OVER( 
                  PARTITION BY employeeid, dateofincident, typeid, description 
                  ORDER BY Id ASC), * 
    FROM dbo.TableName
) 
DELETE FROM cte 
WHERE  rn > 1 

答案 1 :(得分:2)

使用此查询而不使用CTE ....

删除一个 (选择id,name,place,ROW_NUMBER()over(按ID分区,名称,按ID排序)row_Count 来自dup_table)a 其中a.row_Count> 1

答案 2 :(得分:0)

您可以使用以下查询。这假设您要保留最新的行并删除其他重复行。

DELETE [YourTable]
FROM [YourTable]  
LEFT OUTER JOIN (  
   SELECT MAX(ID) as RowId 
   FROM [YourTable]   
   GROUP BY EmployeeId, DateOfIncident, TypeId, Description  
) as KeepRows ON  
   [YourTable].ID = KeepRows.RowId  
WHERE  
   KeepRows.RowId IS NULL