Nie widziałem żadnych odpowiedzi, które używają typowych wyrażeń tabelowych i funkcji okien. To jest to, z czym najłatwiej mi się pracuje.
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);
Coś do zapamiętania:
1) Sprawdzamy tylko pod kątem duplikacji pól w klauzuli partycji.
2) Jeśli masz jakiś powód, aby wybrać jeden duplikat zamiast innych, możesz użyć klauzuli order by, aby ten wiersz miał row_number () = 1
3) Możesz zmienić zachowany duplikat numeru, zmieniając ostatnią klauzulę where na „Where RN> N” z N> = 1 (myślałem, że N = 0 usunie wszystkie wiersze, które mają duplikaty, ale po prostu usunie wszystkie wiersze) .
4) Dodano pole Suma partycji, zapytanie CTE, które oznaczy każdy wiersz liczbą wierszy w grupie. Aby więc wybrać wiersze z duplikatami, w tym pierwszy element, użyj opcji „WHERE cnt> 1”.