Ortak tablo ifadeleri ve pencere işlevleri kullanan herhangi bir yanıt görmedim. Çalışmak için en kolay bulduğum şey bu.
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);
Unutulmaması gereken şeyler:
1) Yalnızca bölüm yan tümcesindeki alanlarda yineleme olup olmadığını kontrol ediyoruz.
2) Diğerlerinden bir kopya seçmek için bir nedeniniz varsa, bu satırın row_number () = 1 değerine sahip olmasını sağlamak için cümle ile sipariş kullanabilirsiniz.
3) N> = 1 ile final where yan tümcesini "Where RN> N" olarak değiştirerek korunan sayı kopyasını değiştirebilirsiniz (N = 0'ın kopyaları olan tüm satırları sileceğini düşünüyordum, ancak tüm satırları silecekti) .
4) Toplam bölümü alanına, her satırı gruptaki sayı satırlarıyla etiketleyecek CTE sorgusu eklendi. Bu nedenle, ilk öğe dahil, yinelenen satırları seçmek için "WHERE cnt> 1" kullanın.