Я не видел ответов, в которых используются общие табличные выражения и оконные функции. Это то, с чем мне легче всего работать.
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 partition для запроса CTE, которое помечает каждую строку числом строк в группе. Поэтому для выбора строк с дубликатами, включая первый элемент, используйте «WHERE cnt> 1».
person
Darrel Lee
schedule
01.11.2017