0Pricing
Coding Interview Prep · Ders

Satırların Güvenli Tekilleştirilmesi

Bir özgün kaydı koruyarak tamamen veya neredeyse yinelenen satırları kaldırın.

Satırların Güvenli Tekilleştirilmesi, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Tekilleştirme Problemi

"Bu tabloda yinelenen satırlar var. Her birinin bir kopyasını tutarak diğerlerini kaldırın." Veri mühendisliği mülakatlarının neredeyse tamamında bunun bir çeşidiyle karşılaşılır. Zorluk, bunu güvenli bir şekilde yapmaktır: tam olarak bir esas satırı tutmak ve yalnızca benzer görünen farklı kayıtları yanlışlıkla silmemek.

Yinelenenleri saptamayı, hangi kopyanın tutulacağını seçmeyi, bir SELECT içinde tekilleştirme yapmayı ve yinelenenleri bir tablodan fiziksel olarak silmeyi ele alacağız.

Önce Yineleneni Tanımlayın

Mülakatçıya sorulacak ilk soru şudur: "İki satırı yinelenen yapan nedir?" Seçenekler şunlardır:

  • Tam yinelenenler: her sütun aynıdır.
  • Anahtar yinelenenleri: iş anahtarı aynıdır (örneğin aynı email), ancak diğer sütunlar farklı olabilir.

Kullanılacak teknik her biri için farklıdır. Varsayımda bulunmayın; yinelenen tanımını netleştirmek en önemli adımdır ve mülakatçılar bunu sormanızı bekler.

Yinelenenleri Saptama

Yinelenen anahtarları bulmak için bir yineleneni tanımlayan sütunlara göre gruplayın ve sayısı birden fazla olan grupları tutun. Böylece herhangi bir değişiklik yapmadan önce hangi anahtarların etkilendiğini ve kaç kopyanın bulunduğunu öğrenirsiniz.

Önce bir saptama sorgusu çalıştırmak dile getirilmeye değer bir iyi uygulamadır: silme işleminden önce problemin boyutunu doğrularsınız.

SELECT email, COUNT(*) AS copies
FROM users
GROUP BY email
HAVING COUNT(*) > 1
ORDER BY copies DESC;

Tam Yinelenenler: DISTINCT

Yinelenenler gerçekten her sütunda aynıysa, salt okunur tekilleştirilmiş bir görünüm SELECT DISTINCT * kadar basittir. UNION (ALL olmadan) da yinelenen satırları kaldırır.

Ancak DISTINCT yalnızca satırın tamamını tekilleştirmek istediğinizde ve hangi kopyanın tutulacağını seçmeniz gerekmediğinde işe yarar. Sütunların farklı olduğu anahtar tabanlı yinelenenler için sıralama gerekir.

-- Read-only dedup of exact-duplicate rows
SELECT DISTINCT customer_id, name, signup_date
FROM customers;

Anahtar Yinelenenleri: ROW_NUMBER

Satırlar bir anahtarı paylaşırken diğer sütunlarda farklılık gösteriyorsa anahtara göre bölümleyin ve her kopyaya numara verin. rn = 1 tutacağınız satırı, rn > 1 ise çıkarılacak fazlalıkları belirtir.

Pencere içindeki ORDER BY, esas olarak hangi kopyanın seçileceğini belirler. Örneğin en son güncellenen satırı tutmak gibi bu seçimi bilinçli yapın.

SELECT *,
  ROW_NUMBER() OVER (
    PARTITION BY email
    ORDER BY updated_at DESC
  ) AS rn
FROM users;

Esas Kopyayı Seçme

Numaralandırmayı bir CTE içine alın ve yalnızca rn = 1 satırlarını tutun. Böylece anahtar başına bir satır, özellikle de ORDER BY ifadenizin ilk sıraya yerleştirdiği satır döndürülür.

Bu SELECT biçimi yıkıcı değildir: temiz bir görünüm oluşturmak veya kaynak tabloya dokunmadan tekilleştirilmiş bir hedef tabloya INSERT ... SELECT ile veri aktarmak için idealdir.

WITH ranked AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY email ORDER BY updated_at DESC
    ) AS rn
  FROM users
)
SELECT user_id, email, name, updated_at
FROM ranked
WHERE rn = 1;

Sıra Seçimi Önemlidir

Bölümleme içindeki ORDER BY bir biçimsel ayrıntı değil, iş kararıdır:

  • ORDER BY updated_at DESC en güncel kaydı tutar.
  • ORDER BY created_at ASC ilk kaydı tutar.
  • ORDER BY id ASC en düşük vekil anahtarı tutar; bu, kararlı ve keyfi bir seçim yapmak için kullanışlıdır.

Birincil sıralama sütununda da eşitlik olduğunda seçilen satırın belirli olması için benzersiz bir eşitlik bozucu ekleyin.

ROW_NUMBER() OVER (
  PARTITION BY email
  ORDER BY updated_at DESC, id ASC
) AS rn

Yinelenenleri Fiziksel Olarak Silme

Yinelenenleri gerçekten tablodan kaldırmak için fazladan satırları (rn > 1) belirleyin ve silin. PostgreSQL ve SQL Server'da bir CTE kullanarak silebilirsiniz; MySQL'de kendi kendine birleştirme veya alt sorgu yaygındır.

Hangi satırların yok olacağını tam olarak önizlemek için her zaman önce eşleşen SELECT sorgusunu çalıştırın. Körlemesine silme, adayların bu soruda başarısız olmasının nedenidir.

WITH ranked AS (
  SELECT ctid,
    ROW_NUMBER() OVER (
      PARTITION BY email ORDER BY updated_at DESC, id ASC
    ) AS rn
  FROM users
)
DELETE FROM users
WHERE ctid IN (SELECT ctid FROM ranked WHERE rn > 1);

Kendi Kendine Birleştirmeyle Silme Kalıbı

Klasik ve taşınabilir bir yaklaşım, her yinelenen anahtar için en küçük id değerine sahip satırı tutar ve geri kalanını kendi kendine birleştirme kullanarak siler. Pencere işlevlerine ihtiyaç duymaz; bu da eski veri tabanı motorlarında önemlidir.

Birleştirme koşulu her satırı aynı anahtarı paylaşan ancak daha küçük bir kimliğe sahip başka bir satırla eşleştirir; böyle daha küçük kimlikli bir eşi olan her satır silinecek bir yinelenendir.

DELETE u1
FROM users u1
JOIN users u2
  ON u1.email = u2.email
 AND u1.id > u2.id;

Güvenlik Kontrol Listesi

Silmeden önce kendinizi güvenceye alın:

  • Silme işlemini bir işlem içinde yürütün; böylece sayı yanlış görünürse ROLLBACK kullanabilirsiniz.
  • Önce silinecek satırlar için SELECT COUNT(*) çalıştırın ve sonucu makullük açısından denetleyin.
  • Bir yedek tablo oluşturmayı düşünün: CREATE TABLE users_bak AS SELECT * FROM users.
  • PARTITION BY sütunlarınızın gerçekten bir yineleneni tanımladığını doğrulayın; aksi hâlde farklı kayıtları silebilirsiniz.
BEGIN;
-- run the DELETE, inspect row count
-- COMMIT; if correct, otherwise ROLLBACK;

Yakın Yinelenenler ve Normalleştirme

Bazen satırlar tam olarak eşit değildir, ancak mantıksal olarak aynıdır: 'Ann@X.com' ile 'ann@x.com' veya sondaki boşluklar gibi. Ham sütun yerine normalleştirilmiş bir ifadeye göre bölümleyin.

Normalleştirmeden söz etmeniz konuya hâkimiyetinizi gösterir: gerçek dünyadaki yinelenenler çoğu zaman basit bir anahtar karşılaştırmasının gözden kaçırdığı büyük-küçük harf, boşluk veya biçimlendirme farklılıklarının arkasına gizlenir.

ROW_NUMBER() OVER (
  PARTITION BY LOWER(TRIM(email))
  ORDER BY updated_at DESC, id ASC
) AS rn

Hızlı Kontrol

Güvenli tekilleştirme yaklaşımını seçin.

Özet: Güvenli Tekilleştirme

Sistematik bir şekilde tekilleştirin:

  • Önce yinelenenin ne olduğunu tanımlayın, ardından GROUP BY / HAVING COUNT(*) > 1 ile saptayın.
  • Tam yinelenenler → DISTINCT. Anahtar yinelenenleri → anahtara göre bölümlenmiş ROW_NUMBER; rn = 1 satırını tutun.
  • Pencere içindeki ORDER BY esas kopyayı seçer; benzersiz bir eşitlik bozucu ekleyin.
  • Sayının önizlemesini yaptıktan sonra rn > 1 satırlarını bir işlem içinde silin.
  • Yakın yinelenenleri yakalamak için anahtarları normalleştirin.

Sıkça Sorulan Sorular

“Satırların Güvenli Tekilleştirilmesi” dersi ücretsiz mi?

Evet — “Satırların Güvenli Tekilleştirilmesi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Satırların Güvenli Tekilleştirilmesi” dersinde ne öğreneceğim?

Bir özgün kaydı koruyarak tamamen veya neredeyse yinelenen satırları kaldırın. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Satırların Güvenli Tekilleştirilmesi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ROW_NUMBER ile Grup Başına İlk N Satır
  2. İlk N İçindeki Eşitlikleri Ele Alma
  3. Satırların Güvenli Tekilleştirilmesi
  4. Anahtar Başına En Güncel Satırı Koruma
← Coding Interview Prep Sayfasına Dön