Sql 删除重复项,但每个保留一行
我有下表: ONBackup表:Sql 删除重复项,但每个保留一行,sql,sql-server,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 有很多“重复”行,对我来说,重复就是发票号码相同,即其他字段可能不同 该表有140万行(大约100万个
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
有很多“重复”行,对我来说,重复就是发票号码相同,即其他字段可能不同
该表有140万行(大约100万个重复),因此不确定下面的内容是否有效,因为我已经厌倦了等待3个小时和计数,它肯定比我想象的更需要CPU
DELETE FROM ONBackup
WHERE Invoice NOT IN
(
SELECT MIN(Invoice)
FROM ONBackup
GROUP BY Invoice
)
有没有更快捷的方法可以做到这一点?我认为CTE是一个很好的选择:(注意,前面的语句必须以分号结尾) 使用
行编号()
函数:
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;
这将为每个
发票留下最新的fromdate
您想删除发票号相同的数据…是的,但保留一行发票号,不管是哪一行。删除数据的原因是什么?只是好奇…我已经加入了两个表,并得到了由于我的知识缺乏重复负载重新加入@也许你不需要删除任何东西。如果您只需要表中唯一的发票号,那么使用select distinct和group by或其他方法。
DELETE A
FROM
(
select *,row_number() over (partition by invoice order by invoice)as rn from
table1
) A
WHERE A.rn > 1
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;