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

前端之家收集整理的这篇文章主要介绍了SQL查询 – 如果超过3个重复,则删除重复项?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有人有一个优雅的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

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

谢谢

解决方法

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

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

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

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

原文链接:https://www.f2er.com/mssql/83064.html

猜你在找的MsSQL相关文章