Я не видел ответов, которые используют общие выражения таблиц и функции окна. Это то, с чем мне легче всего работать.
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);
Что следует отметить:
1) Мы проверяем только дублирование полей в предложении раздела.
2) Если у вас есть повод выбрать один дубликат над другими, вы можете использовать предложение order by, чтобы эта строка имела row_number () = 1
3) Вы можете изменить дубликат числа, сохраненный, изменив окончательное предложение where на «Where RN> N "с N> = 1 (я думал, что N = 0 удалит все строки с дубликатами, но просто удалит все строки).
4) Добавлено поле раздела Sum, запрос CTE который помечает каждую строку номерами строк в группе. Поэтому для выбора строк с дубликатами, включая первый элемент, используйте «WHERE cnt> 1».