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
Dotaz vytváří 'číslo řádku' pro každý záznam, seskupené podle (dupcol1, dupcol2) a seřazené podle ID. Ve skutečnosti toto číslo řádku počítá 'duplikáty', které mají stejný dupcol1 a dupcol2 a přiřadí jim číslo 1, 2, 3.. N, pořadí podle ID. Pokud si chcete ponechat pouze 2 'duplikáty', musíte smazat ty, kterým byla přiřazena čísla 3,4,.. N
a to je část, o kterou se stará DELLETE.. WHERE rn > 2;
Pomocí této metody můžete změnit ORDER BY
podle vaší preferované objednávky (např.ORDER BY ID DESC
), takže LATEST
má rn=1
, pak další k nejnovější je rn=2 a tak dále. Zbytek zůstává stejný, DELETE
odstraní pouze ty nejstarší, protože mají nejvyšší čísla řádků.
Na rozdíl od tato úzce související otázka , jak se podmínka stává složitější, je používání CTE a row_number() jednodušší. Výkon může být stále problematický, pokud neexistuje správný přístupový index.