SQL查询 – 如果超过3个重复,则删除重复项?
发布时间:2020-12-12 16:19:20 所属栏目:MsSql教程 来源:网络整理
导读:有没有人有一个优雅的sql语句来删除表中的重复记录,但只有当重复数超过x时?所以它允许最多2或3个重复,但就是这样吗? 目前我有一个select语句执行以下操作: delete tablefrom table tleft outer join ( select max(id) as rowid,dupcol1,dupcol2 from table
有没有人有一个优雅的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()变得更加简单.如果不存在适当的访问索引,性能可能仍然存在问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |