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
Truy vấn đang tạo ra một 'số hàng' cho mỗi bản ghi, được nhóm theo (Dupcol1, Dupcol2) và được sắp xếp theo ID. Trên thực tế, số hàng này đếm 'các bản sao' có cùng conccol1 và Dupcol2 và gán sau đó số 1, 2, 3 .. N, thứ tự theo ID. Nếu bạn chỉ muốn giữ lại 2 'bản sao', thì bạn cần xóa những 'bản sao' đã được gán các số 3,4,.. N
và đó là phần được chăm sóc bởi DELLETE.. WHERE rn > 2;
Sử dụng phương pháp này, bạn có thể thay đổi ORDER BY
để phù hợp với đơn đặt hàng ưa thích của bạn (ví dụ:ORDER BY ID DESC
), để LATEST
có rn=1
, thì giá trị mới nhất tiếp theo là rn =2, v.v. Phần còn lại giữ nguyên, DELETE
sẽ chỉ loại bỏ những hàng cũ nhất vì chúng có số hàng cao nhất.
Không giống như câu hỏi có liên quan chặt chẽ này , khi điều kiện trở nên phức tạp hơn, việc sử dụng CTE và row_number () trở nên đơn giản hơn. Hiệu suất vẫn có thể có vấn đề nếu không tồn tại chỉ mục truy cập thích hợp.