Tôi không thấy bất kỳ câu trả lời nào sử dụng các biểu thức bảng và hàm cửa sổ phổ biến. Đây là những gì tôi thấy dễ dàng nhất để làm việc với.
DELETE FROM
YourTable
WHERE
ROWID IN
(WITH Duplicates
AS (SELECT
ROWID RID,
ROW_NUMBER()
OVER(
PARTITION BY First_Name, Last_Name, Birth_Date)
AS RN
SUM(1)
OVER(
PARTITION BY First_Name, Last_Name, Birth_Date
ORDER BY ROWID ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING)
AS CNT
FROM
YourTable
WHERE
Load_Date IS NULL)
SELECT
RID
FROM
duplicates
WHERE
RN > 1);
Những điều cần lưu ý:
1) Chúng tôi chỉ kiểm tra sự trùng lặp trên các trường trong mệnh đề phân vùng.
2) Nếu bạn có một số lý do để chọn một bản sao so với các mục khác, bạn có thể sử dụng một mệnh đề theo mệnh đề để tạo hàng đó sẽ có row_number () = 1
3) Bạn có thể thay đổi số trùng lặp được bảo toàn bằng cách thay đổi mệnh đề where thành "Trường hợp RN> N" với N> = 1 (Tôi đã nghĩ N = 0 sẽ xóa tất cả các hàng có trùng lặp, nhưng nó sẽ chỉ xóa tất cả các hàng) .
4) Đã thêm trường phân vùng Sum, truy vấn CTE sẽ gắn thẻ mỗi hàng với các hàng số trong nhóm. Vì vậy, để chọn các hàng có trùng lặp, bao gồm mục đầu tiên sử dụng "WHERE cnt> 1".