没有人有一个优雅的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;
3,4,.. N
DELLETE.. WHERE rn > 2;
使用此方法,您可以更改,ORDER BY使其适合您的首选顺序(例如ORDER BY ID DESC),这样LATESThas rn=1,然后倒数第二个为rn = 2,依此类推。其余的保持不变,DELETE它将删除最旧的那些,因为它们具有最高的行号。
ORDER BY
ORDER BY ID DESC
LATEST
rn=1
DELETE
与这个紧密相关的问题)不同,随着条件变得越来越复杂,使用CTE和row_number()变得更加简单。如果没有正确的访问索引,性能仍然可能会出现问题。