0Pricing
Coding Interview Prep · Pelajaran

Menghapus Duplikat Baris dengan Aman

Hapus baris yang sama persis maupun hampir duplikat sambil mempertahankan satu rekaman kanonis.

Menghapus Duplikat Baris dengan Aman adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Masalah Deduplikasi

"Tabel ini memiliki baris duplikat. Hapus baris tersebut, tetapi pertahankan satu salinan dari masing-masing baris." Hampir setiap wawancara rekayasa data mencakup variasi masalah ini. Tantangannya adalah melakukannya dengan aman: mempertahankan tepat satu baris kanonis dan tidak menghapus catatan berbeda yang hanya tampak serupa.

Anda akan mempelajari cara mendeteksi duplikat, memilih salinan yang dipertahankan, melakukan deduplikasi dalam SELECT, dan menghapus duplikat secara fisik dari tabel.

Tentukan Duplikat Terlebih Dahulu

Pertanyaan pertama yang perlu diajukan kepada pewawancara: "Apa yang membuat dua baris dianggap duplikat?" Pilihannya antara lain:

  • Duplikat persis: setiap kolom identik.
  • Duplikat berdasarkan kunci: memiliki kunci bisnis yang sama (misalnya email yang sama), tetapi kolom lainnya mungkin berbeda.

Tekniknya berbeda untuk masing-masing jenis. Jangan pernah berasumsi; memperjelas definisi duplikat adalah langkah yang paling penting, dan pewawancara mengharapkan Anda mengajukan pertanyaan ini.

Mendeteksi Duplikat

Untuk menemukan kunci duplikat, kelompokkan berdasarkan kolom yang mendefinisikan duplikat, lalu pertahankan kelompok dengan jumlah lebih dari satu. Dengan demikian, Anda mengetahui kunci mana yang terdampak dan berapa banyak salinannya sebelum mengubah apa pun.

Menjalankan kueri pendeteksian terlebih dahulu adalah praktik terbaik yang perlu Anda sampaikan: Anda memverifikasi skala masalah sebelum melakukan penghapusan.

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

Duplikat Persis: DISTINCT

Jika duplikat benar-benar identik di semua kolom, tampilan hasil deduplikasi yang hanya dapat dibaca cukup dibuat dengan SELECT DISTINCT *. UNION (tanpa ALL) juga menghapus baris duplikat.

Namun, DISTINCT hanya membantu jika Anda ingin menghapus duplikat dari seluruh baris dan tidak perlu memilih salinan mana yang dipertahankan. Untuk duplikat berdasarkan kunci yang kolomnya berbeda, Anda memerlukan pemeringkatan.

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

Duplikat Berdasarkan Kunci: ROW_NUMBER

Jika beberapa baris memiliki kunci yang sama tetapi berbeda pada kolom lainnya, bagi berdasarkan kunci tersebut dan beri nomor pada setiap salinan. rn = 1 menandai baris yang dipertahankan; rn > 1 menandai salinan tambahan yang dibuang.

ORDER BY di dalam jendela menentukan salinan mana yang menjadi kanonis. Pilihlah dengan sengaja, misalnya dengan mempertahankan baris yang terakhir diperbarui.

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

Memilih Salinan Kanonis

Bungkus penomoran dalam sebuah CTE dan pertahankan hanya rn = 1. Ini mengembalikan satu baris untuk setiap kunci, tepatnya baris yang diberi peringkat pertama oleh ORDER BY.

Bentuk SELECT ini tidak merusak data: sangat cocok untuk membuat tampilan bersih atau memasukkan hasil ke tabel target yang sudah dideduplikasi melalui INSERT ... SELECT, tanpa menyentuh sumbernya.

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;

Pentingnya Menentukan Urutan

ORDER BY di dalam partisi adalah keputusan bisnis, bukan sekadar formalitas:

  • ORDER BY updated_at DESC mempertahankan catatan yang paling baru.
  • ORDER BY created_at ASC mempertahankan catatan asli.
  • ORDER BY id ASC mempertahankan kunci pengganti terendah, yang berguna sebagai pilihan arbitrer yang stabil.

Tambahkan penentu seri yang unik agar baris yang dipilih tetap deterministik ketika kolom urutan utama juga memiliki nilai seri.

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

Menghapus Duplikat Secara Fisik

Untuk benar-benar menghapus duplikat dari tabel, identifikasi baris tambahan (rn > 1), lalu hapus baris tersebut. Di PostgreSQL dan server SQL, Anda dapat menghapusnya menggunakan CTE; di MySQL, penggabungan tabel dengan dirinya sendiri atau subkueri lebih umum digunakan.

Selalu jalankan SELECT yang sesuai terlebih dahulu untuk melihat pratinjau baris mana saja yang akan hilang. Penghapusan tanpa pemeriksaan adalah cara kandidat gagal menjawab pertanyaan ini.

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);

Pola Penghapusan dengan Penggabungan Diri

Pendekatan portabel klasik mempertahankan baris dengan id terkecil untuk setiap kunci duplikat, lalu menghapus sisanya menggunakan penggabungan tabel dengan dirinya sendiri. Pendekatan ini tidak memerlukan fungsi jendela, sehingga berguna pada mesin basis data yang lebih lama.

Kondisi penggabungan memasangkan setiap baris dengan baris lain yang memiliki kunci sama tetapi id lebih kecil; setiap baris yang memiliki pasangan dengan id lebih kecil dianggap sebagai duplikat yang harus dihapus.

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

Daftar Periksa Keamanan

Sebelum menghapus, lindungi data Anda:

  • Bungkus penghapusan dalam sebuah transaksi agar Anda dapat melakukan ROLLBACK jika jumlahnya tampak tidak benar.
  • Jalankan SELECT COUNT(*) untuk menghitung baris yang akan dihapus terlebih dahulu, lalu periksa kewajaran hasilnya.
  • Pertimbangkan untuk membuat tabel cadangan: CREATE TABLE users_bak AS SELECT * FROM users.
  • Pastikan kolom PARTITION BY Anda benar-benar mendefinisikan duplikat; jika tidak, Anda mungkin menghapus catatan yang berbeda.
BEGIN;
-- run the DELETE, inspect row count
-- COMMIT; if correct, otherwise ROLLBACK;

Duplikat Hampir Sama dan Normalisasi

Terkadang baris tidak benar-benar sama, tetapi secara logis merujuk pada hal yang sama: 'Ann@X.com' dan 'ann@x.com', atau spasi di bagian akhir. Partisikan berdasarkan ekspresi yang dinormalisasi, bukan kolom mentah.

Menyebutkan normalisasi menunjukkan pemahaman yang matang: dalam data nyata, duplikat sering tersembunyi di balik perbedaan huruf besar-kecil, spasi kosong, atau pemformatan yang tidak ditemukan oleh perbandingan kunci sederhana.

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

Pemeriksaan Singkat

Pilih pendekatan deduplikasi yang aman.

Meninjau Kembali: Deduplikasi Aman

Lakukan deduplikasi secara sistematis:

  • Pertama, tentukan definisi duplikat, lalu deteksi dengan GROUP BY / HAVING COUNT(*) > 1.
  • Duplikat persis → DISTINCT. Duplikat berdasarkan kunci → ROW_NUMBER yang dipartisi berdasarkan kunci, lalu pertahankan rn = 1.
  • ORDER BY pada jendela memilih salinan kanonis; tambahkan penentu seri yang unik.
  • Hapus baris rn > 1 di dalam transaksi setelah memeriksa pratinjau jumlahnya.
  • Normalkan kunci untuk menangkap duplikat yang hampir sama.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghapus Duplikat Baris dengan Aman” gratis?

Ya — teks lengkap “Menghapus Duplikat Baris dengan Aman” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menghapus Duplikat Baris dengan Aman”?

Hapus baris yang sama persis maupun hampir duplikat sambil mempertahankan satu rekaman kanonis. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menghapus Duplikat Baris dengan Aman” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Baris Top-N Per Grup dengan ROW_NUMBER
  2. Menangani Nilai Seri dalam Top-N
  3. Menghapus Duplikat Baris dengan Aman
  4. Mempertahankan Baris Terbaru Per Kunci
← Kembali ke Coding Interview Prep