Saya tidak melihat jawaban apa pun yang menggunakan ekspresi tabel umum dan fungsi jendela. Inilah yang menurut saya paling mudah untuk dikerjakan.
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);
Sesuatu yang perlu diperhatikan:
1) Kami hanya memeriksa duplikasi pada bidang dalam klausa partisi.
2) Jika Anda memiliki beberapa alasan untuk memilih satu duplikat daripada yang lain, Anda dapat menggunakan pesanan dengan klausa untuk membuat baris tersebut memiliki row_number () = 1
3) Anda dapat mengubah jumlah duplikat yang disimpan dengan mengubah klausa tempat final ke "Di mana RN> N" dengan N> = 1 (saya berpikir N = 0 akan menghapus semua baris yang memiliki duplikat, tetapi hanya akan menghapus semua baris) .
4) Menambahkan bidang Sum partisi kueri CTE yang akan menandai setiap baris dengan baris nomor dalam grup. Jadi untuk memilih baris dengan duplikat, termasuk item pertama gunakan "WHERE cnt> 1".