Forberedelse til SQL-interview · Lektion

Sikker fjernelse af dubletter

Fjern nøjagtige og næsten identiske rækker, mens én kanonisk post bevares

Lektion 3 af 413 trin

Sikker fjernelse af dubletter er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.

Problemet med dubletter

"Denne tabel har dubletter. Fjern dem, men behold én kopi af hver." Næsten alle jobsamtaler om data engineering indeholder en variant af dette. Udfordringen er at gøre det sikkert: beholde præcis én kanonisk række og ikke ved et uheld slette forskellige poster, der blot ligner hinanden.

Vi gennemgår, hvordan du finder dubletter, vælger hvilken kopi der skal beholdes, fjerner dubletter i en SELECT og fysisk sletter dubletter fra en tabel.

Definér dubletter først

Det første spørgsmål, du bør stille intervieweren, er: "Hvad gør to rækker til dubletter?" Mulighederne omfatter:

  • Identiske dubletter: alle kolonner er identiske.
  • Dubletter med samme nøgle: den samme forretningsnøgle, f.eks. den samme email, men andre kolonner kan være forskellige.

Teknikken varierer i de to tilfælde. Antag aldrig noget; at afklare definitionen på en dublet er det vigtigste trin, og interviewere forventer, at du spørger.

Find dubletter

Hvis du vil finde dublette nøgler, skal du gruppere efter de kolonner, der definerer en dublet, og beholde grupper med et antal større end én. Så kan du se, hvilke nøgler der er berørt, og hvor mange kopier der findes, før du ændrer noget.

Det er en god praksis først at køre en forespørgsel, der finder dubletter, og sige det højt: Du bekræfter problemets omfang, før du sletter.

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

Identiske dubletter: DISTINCT

Hvis dubletterne virkelig er identiske i alle kolonner, er en skrivebeskyttet visning uden dubletter så enkel som SELECT DISTINCT *. UNION (uden ALL) fjerner også dublette rækker.

DISTINCT hjælper dog kun, når du vil fjerne dubletter fra hele rækken og ikke har brug for at vælge, hvilken kopi der skal beholdes. Hvis dubletterne har samme nøgle, men forskellige kolonner, har du brug for rangordning.

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

Dubletter med samme nøgle: ROW_NUMBER

Når rækker har samme nøgle, men forskellige værdier i andre kolonner, skal du opdele efter nøglen og nummerere hver kopi. rn = 1 markerer den række, du beholder, mens rn > 1 markerer de ekstra rækker, der skal kasseres.

ORDER BY i vinduesfunktionen afgør, hvilken kopi der er den kanoniske. Vælg det bevidst, f.eks. ved at beholde den senest opdaterede række.

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

Vælg den kanoniske kopi

Indpak nummereringen i en CTE, og behold kun rn = 1. Det returnerer én række pr. nøgle, nemlig den række som din ORDER BY placerede først.

Denne SELECT-form er ikke-destruktiv: Den er perfekt til at opbygge en ren visning eller levere data til en INSERT ... SELECT i en måltabel uden dubletter, uden at kilden berøres.

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;

Valget af rækkefølge er vigtigt

ORDER BY i partitionen er en forretningsmæssig beslutning, ikke en formalitet:

  • ORDER BY updated_at DESC beholder den nyeste post.
  • ORDER BY created_at ASC beholder den oprindelige post.
  • ORDER BY id ASC beholder den laveste surrogatnøgle, hvilket er nyttigt som et stabilt vilkårligt valg.

Tilføj en entydig sekundær sorteringskolonne, så den valgte række bliver deterministisk, når den primære sorteringskolonne også har ens værdier.

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

Slet dubletter fysisk

Hvis du faktisk vil fjerne dubletter fra tabellen, skal du identificere de ekstra rækker (rn > 1) og slette dem. I Postgres og SQL Server kan du slette ved hjælp af en CTE; i MySQL er et selv-join eller en underforespørgsel almindeligt.

Kør altid først den tilsvarende SELECT for at forhåndsvise præcis, hvilke rækker der forsvinder. Det er ved at slette i blinde, at kandidater fejler dette spørgsmål.

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

Mønsteret for sletning med selv-join

En klassisk tilgang, der kan bruges på tværs af systemer, beholder rækken med den laveste id pr. dubletnøgle og sletter resten ved hjælp af et selv-join. Den kræver ikke vinduesfunktioner, hvilket er vigtigt på ældre databasemotorer.

Join-betingelsen parrer hver række med en anden række, der har samme nøgle, men et lavere id; enhver række, der har en sådan tvilling med lavere id, er en dublet, der skal slettes.

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

Tjekliste for sikkerhed

Beskyt dig selv, før du sletter:

  • Pak sletningen ind i en transaktion, så du kan udføre ROLLBACK, hvis antallet ser forkert ud.
  • Kør først SELECT COUNT(*) for de rækker, der skal slettes, og kontrollér resultatet fornuftigt.
  • Overvej en sikkerhedskopitabel: CREATE TABLE users_bak AS SELECT * FROM users.
  • Bekræft, at dine PARTITION BY-kolonner virkelig definerer en dublet, ellers kan du slette forskellige poster.
BEGIN;
-- run the DELETE, inspect row count
-- COMMIT; if correct, otherwise ROLLBACK;

Næsten-dubletter og normalisering

Nogle gange er rækkerne ikke nøjagtigt ens, men logisk set de samme: 'Ann@X.com' over for 'ann@x.com' eller mellemrum til sidst. Opdel efter et normaliseret udtryk i stedet for den rå kolonne.

Hvis du nævner normalisering, viser du modenhed: Dubletter i virkeligheden gemmer sig ofte bag forskelle i store og små bogstaver, blanktegn eller formatering, som en naiv sammenligning af nøgler ikke opdager.

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

Hurtigt tjek

Vælg den sikre tilgang til at fjerne dubletter.

Opsummering: Sikker fjernelse af dubletter

Fjern dubletter systematisk:

  • Definér først, hvad en dublet er, og find dem derefter med GROUP BY / HAVING COUNT(*) > 1.
  • Identiske dubletter → DISTINCT. Dubletter med samme nøgle → ROW_NUMBER opdelt efter nøglen; behold rn = 1.
  • Vinduesfunktionens ORDER BY vælger den kanoniske kopi; tilføj en entydig sekundær sorteringskolonne.
  • Slet rækkerne med rn > 1 i en transaktion, når du først har forhåndsvist antallet.
  • Normalisér nøgler for at finde næsten-dubletter.
Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “Sikker fjernelse af dubletter” gratis?

Ja — hele teksten til “Sikker fjernelse af dubletter” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Sikker fjernelse af dubletter”?

Fjern nøjagtige og næsten identiske rækker, mens én kanonisk post bevares Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?

Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Sikker fjernelse af dubletter”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?

Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Top-N-rækker pr. gruppe med ROW_NUMBER
  2. Håndtering af ligheder i Top-N
  3. Sikker fjernelse af dubletter
  4. Bevar den seneste række pr. nøgle
← Tilbage til Forberedelse til SQL-interview