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