SQL查询 - 如果超过3个重复,删除重复项?

Sco*_*ach 6 sql sql-server duplicates

有没有人有一个优雅的sql语句来删除表中的重复记录,但只有当重复数超过x时?所以它允许最多2或3个重复,但就是这样吗?

目前我有一个select语句执行以下操作:

delete table
from table t
left outer join (
 select max(id) as rowid, dupcol1, dupcol2
 from table
 group by dupcol1, dupcol2
) as keeprows on t.id=keeprows.rowid
where keeprows.rowid is null
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是现在我想要做的只是删除那些行,如果他们有超过2个重复.

谢谢

Rem*_*anu 7

with cte as (
  select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
     from table)
delete from cte
   where rn > 2; -- or >3 etc
Run Code Online (Sandbox Code Playgroud)

该查询为每条记录制作一个"行号",按(dupcol1,dupcol2)分组并按ID排序.实际上,此行号计数具有相同dupcol1和dupcol2的"重复",然后按ID排序,然后分配数字1,2,3 .. N. 如果你想只保留2'重复',那么你需要删除那些被分配了数字的那些,3,4,.. N这是由DELLETE.. WHERE rn > 2;

使用此方法,您可以更改ORDER BY为适合您的首选顺序(例如.ORDER BY ID DESC),以便LATESTrn=1,然后是最新的顺序是rn = 2,依此类推.其余部分保持不变,DELETE只删除最旧的部分,因为它们具有最高的行数.

这个密切相关的问题不同,随着条件变得更加复杂,使用CTE和row_number()变得更加简单.如果不存在适当的访问索引,性能可能仍然存在问题.