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

4
以下是我表中的列:
Id
EmployeeId
IncidentRecordedById
DateOfIncident
Comments
TypeId
Description
IsAttenIncident

我想删除重复的行,其中EmployeeId、DateOfIncident、TypeIdDescription都相同 - 只是为了澄清 - 我确实想保留其中一个。我认为我应该使用PARTITIONOVER子句,但我不确定。

谢谢

3个回答

18

如果您想保留重复分组中的一行,可以使用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 

2

不使用CTE使用以下查询:

从dup_table中删除a,其中:

  • ID:标识符
  • Name:名称
  • Place:位置
  • ROW_NUMBER() over (partition by id,name,place order by id) row_Count:根据id排序,计算每个id、name和place组合的行数

删除时保留出现次数大于1的行。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接