Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除重复项,但每个保留一行_Sql_Sql Server - Fatal编程技术网

Sql 删除重复项,但每个保留一行

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万个

我有下表:

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万个重复),因此不确定下面的内容是否有效,因为我已经厌倦了等待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;