在SQL中删除重复行

6

我有一张带有唯一id但有重复行信息的表格。

我可以使用以下查询找到具有重复信息的行。

SELECT
    PersonAliasId, StartDateTime, GroupId, COUNT(*) as Count
FROM
    Attendance
GROUP BY
    PersonAliasId, StartDateTime, GroupId
HAVING
    COUNT(*) > 1

我可以使用此查询手动删除行并保留所需的1。
Delete
From Attendance
Where Id IN(SELECT
    Id
FROM
    Attendance
Where PersonAliasId = 15
    and StartDateTime = '9/24/2017'
and GroupId = 1429
Order By ModifiedDateTIme Desc
Offset 1 Rows)

我对SQL不够熟悉,无法想出如何使用第一个查询中的行来删除重复项,只留下最近的。第一个查询返回了超过3481条记录,手动逐一处理非常耗时。

我该如何像第一个查询一样找到重复行,并删除除最近的之外的所有内容?

3个回答

11

您可以使用公共表达式来删除重复项:

WITH Cte AS(
    SELECT *,
        Rn = ROW_NUMBER() OVER(PARTITION BY PersonAliasId, StartDateTime, GroupId 
                                ORDER BY ModifiedDateTIme DESC)
    FROM Attendance
)
DELETE FROM Cte WHERE Rn > 1;

这将为每个PersonAliasId-StartDateTime-GroupId组合保留最近的记录。


这样做就行了,非常感谢! - Kevin Rutledge

1
使用MAX聚合函数来确定每个组合/人员的最新startdatetime。然后删除没有该最新时间的记录。
DELETE a
FROM attendance as a
INNER JOIN (  
   SELECT
        PersonAliasId, MAX(StartDateTime) AS LatestTime, GroupId,
    FROM
        Attendance
    GROUP BY
        PersonAliasId, GroupId
    HAVING
        COUNT(*) > 1
) as b
on a.personaliasid=b.personaliasid and a.groupid=b.groupid and a.startdatetime < b.latesttime

1
与CTE答案相同 - 给Felix支票。
delete 
from ( SELECT rn = ROW_NUMBER() OVER(PARTITION BY PersonAliasId, StartDateTime, GroupId 
                                     ORDER BY ModifiedDateTIme DESC)
        FROM Attendance
     ) tt 
where tt.rn > 1

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