Hvordan du identificerer, fjerner og forhindrer duplikerede rækker
📚 Læsetid: 6-8 minutter💾 SQL-eksempler: 7🎬 Video-længde: ~2:45
Hvad skal denne post løse?
Dubletter ødelægger analyser. Én dublet i en customers-tabel betyder at din DSO, revenue-rapportering, eller customer lifetime value-beregning bliver forkert. I denne post viser vi dig 5 metoder til dubletter-fjernelse i MySQL 8.0 — fra identifikation til sikker deletion, med testable strategier.
✨ After læsning kan du:
✓ Identificere dubletter med GROUP BY
✓ Bruge ROW_NUMBER() OVER PARTITION BY
✓ Vælge mellem 5 delete-strategier baseret på use case
✓ Validere resultater med sum-kontrol
✓ Forhindre fremtidigt dubletter med UNIQUE constraints
Del 1: Identifikation — Find dupletter før du sletter
Hvad er en dublet?
En dublet er to eller flere rækker med identiske værdier i én eller flere nøglekolonner. Eksempler:
- Samme email i customers (bør være unik)
- Samme ordre-ID + dato i orders (samme transaktion importeret 2x)
- Samme invoice-nummer med samme beløb (duplet invoice)
Simpel identifikation: Tæl forekomster
Start med at tælle hvor mange gange hver værdi optræder:
SQL
SELECT email, COUNT(*) AS antal_rækker FROM customers GROUP BY email HAVING COUNT(*) > 1 ORDER BY antal_rækker DESC;
| antal_rækker | |
|---|---|
| john.doe@example.com | 3 |
| jane.smith@example.com | 2 |
Fortolkning: john.doe@example.com optræder 3 gange — mindst 2 er dubletter.
Se de aktuelle dublet-rækker (med ranking)
SQL
SELECT id, email, created_at, ROW_NUMBER() OVER (PARTITION BY email ORDER BY created_at) AS rk FROM customers WHERE email IN ( SELECT email FROM customers GROUP BY email HAVING COUNT(*) > 1 ) ORDER BY email, created_at;
⚠️ Vigtig note: ROW_NUMBER() OVER PARTITION giver hver gruppe sin egen nummerering. Så for hver email starter den fra 1. rk=1 er første forekomst (keep), rk=2+ er dubletter (delete).