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 删除重复项的主要内容,如果未能解决你的问题,请参考以下文章