删除重复项但每个都留一行

dav*_*est 0 sql sql-server

我有下表:

ONBackup表:

Contract    FromDate    Invoice     Data
232         12/12/2017  123
232         14/02/2018  123
232         15/07/2018  123
232         14/02/2017  676
311         12/12/2017  881
Run Code Online (Sandbox Code Playgroud)

有很多"重复"的行,我的副本是发票号码相同的地方,即其他字段可以不同.

该表有140万行(大约一百万个重复),所以不确定下面是否会起作用,因为我感到厌倦了等待3个小时并计算,它必须比我更多的CPU饥饿.

DELETE FROM ONBackup
WHERE Invoice NOT IN
(
    SELECT MIN(Invoice)
    FROM ONBackup
    GROUP BY Invoice
)
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来做到这一点?

Yog*_*rma 5

使用row_number()功能:

delete b
from (select b.*, row_number() over (partition by b.invoice order by b.fromdate desc) as seq 
      from ONBackup b
     ) b
where seq > 1;
Run Code Online (Sandbox Code Playgroud)

fromdate为每个invoices 留下了最新信息.