删除特定的重复项(除最新之外的所有)

Ben*_* Z. 1 sql-server sql-server-2012

删除重复行时,使用教程中的以下查询,我将如何强制删除找到的哪些重复行?

DELETE FROM dbo.ATTENDANCE 
    WHERE AUTOID NOT IN (SELECT MIN(AUTOID) _
FROM dbo.ATTENDANCE 
    GROUP BY EMPLOYEE_ID,ATTENDANCE_DATE) 
Run Code Online (Sandbox Code Playgroud)

这很好用。我使用这个的原因是因为唯一可用的唯一 ID 是IDENTITY列中的一个。为了确定是否有重复的行,我必须查看多列的组合。

但是,如果我有一组重复的行,我/SQL Server 如何决定删除哪些行?我将如何强制它删除除最高IDENTITY值之外的所有内容?

EMPLOYEE_ID     ATTENDANCE_DATE     AUTOID
A001            2011-01-01          1
A001            2011-01-01          2
Run Code Online (Sandbox Code Playgroud)

如果我现在运行查询,它恰好删除了第二个,有AUTOID2 个。但我试图删除除这个之外的所有内容(因为这是最新添加的)。

Tar*_*ryn 6

您可以实现一个查询,row_number()用于删除除最新行之外的所有内容。这将按 对数据进行分区employee_id并按autoId列对其进行排序,然后删除大于第一行号的所有内容:

;with cte as
(
  select [EMPLOYEE_ID], [ATTENDANCE_DATE], [AUTOID],
    row_number() over(partition by [EMPLOYEE_ID], [ATTENDANCE_DATE] 
                      order by  [AUTOID] desc) rn
  from dbo.ATTENDANCE
)
delete 
from cte 
where rn > 1;
Run Code Online (Sandbox Code Playgroud)

参见SQL Fiddle with Demo