SQL Server 删除重复项

Posted

技术标签:

【中文标题】SQL Server 删除重复项【英文标题】:SQL Server Remove Duplicates 【发布时间】:2020-07-10 21:25:18 【问题描述】:

我有一张表格,用于跟踪员工以及他们在政策中花费的天数。我不生成这些数据,它被转储到我们的服务器日报。

表格如下所示:

我的目标是通过仅保留最近的日期来消除重复项。 在此示例中,如果我运行查询,我希望它为 Nicholas Morris 保留第 11 行,为 Tiana Sullivan 保留第 14 行。

假设:名字和姓氏的组合是唯一的

到目前为止, 这就是我一直在做的:

select *
from 
Employees IN(
    Select ID
    from Employees
    group by FirstName, lastName
    Having count(*) > 1)

这会将重复的行返回给我,我必须手动搜索它们并删除我不想保留的行。

我相信有更好的方法来做到这一点 感谢您的帮助

【问题讨论】:

【参考方案1】:

您可以使用 CTE 和 ROW_NUMBER() 函数来执行此操作。

获取数据的查询是:

SELECT ID, FirstName, LastName, ROW_NUMBER() 
     OVER (PARTITION BY FirstName, LastName ORDER BY DaysInPolicy DESC) AS Identifier
FROM 
   Employees

删除重复的查询是:

;WITH CTE AS (
     SELECT ID, ROW_NUMBER() 
     OVER (PARTITION BY FirstName, LastName ORDER BY DaysInPolicy DESC) AS Identifier
FROM 
   Employees
)
DELETE E
FROM 
   Employees E
   INNER JOIN CTE C ON C.ID = E.ID
WHERE 
   C.Identifier > 1

【讨论】:

【参考方案2】:

您可以使用exists 运算符删除任何具有相同名字和姓氏但日期较新的行:

DELETE FROM employees e1
WHERE  EXISTS (SELECT *
               FROM   employees e2
               WHERE  e1.FirstName    = e2.FirstName AND
                      e1.LastName     = e2.LastName  AND
                      e1.DaysInPolicy < e2.DaysInPolicy)

【讨论】:

这对我有用。只需在 Delete 后添加 e1 即可使语句生效【参考方案3】:

试试这个:

SELECT * FROM 
(   
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Last_Name, First_Nmae ORDER BY DaysInPolicy DESC) AS RowNum 
    FROM Employees
) AS Emp
WHERE Emp.RowNum > 1

【讨论】:

这也会产生正确的结果。对于将使用它的人,只需将选择替换为“删除”即可。谢谢

以上是关于SQL Server 删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 2005删除重复数据

如何在 SQL Server 中删除不精确的重复项

MS SQL - 查找和删除重复项[重复]

从 sql union 中删除重复项

通过相加删除重复项 [SQL]

Oracle SQL:如何删除 listagg 中的重复项