Forberedelse til SQL-intervju · leksjon

Sammenligne rader i én tabell

Mønstre med self-join for å finne par, duplikater og tilstøtende poster.

Leksjon 3 av 413 trinn

Sammenligne rader i én tabell er en gratis leksjon i Forberedelse til SQL-intervju på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til SQL-intervju, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

SELF JOIN for sammenligning av rad mot rad

Utover hierarkier er det andre viktige bruksområdet for en self join å sammenligne rader i den samme tabellen med hverandre. I stedet for et foreldre-barn-forhold kobler du sammen vilkårlige rader for å finne duplikater, nesten like treff eller tilstøtende rader.

Mønsteret er det samme: gi tabellen to aliaser og skriv en ON-betingelse som uttrykker forholdet mellom de to radene du vil koble sammen.

Finne par i samme gruppe

Et klassisk spørsmål er å finne alle par av ansatte som jobber i samme avdeling. Koble tabellen til seg selv på lik avdeling, men sørg for at de to radene holdes adskilt.

En naiv kobling ville også koble hver ansatt til seg selv og produsere hvert par to ganger. Dette løser vi nedenfor.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

Fjerne selvpar og speilvendte duplikater

Det er to problemer ved paring i samme gruppe: En rad samsvarer med seg selv (Alice med Alice), og hvert par vises to ganger (Alice–Bob og Bob–Alice).

Du løser begge med én ulikhetsbetingelse: a.id < b.id. Dette garanterer at de to radene er forskjellige og beholder bare én rekkefølge for hvert par.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

Hvorfor a.id < b.id og ikke a.id <> b.id

Hvis du bruker a.id <> b.id, fjernes selvparene, men begge rekkefølgene returneres fortsatt, slik at resultatet blir dobbelt så stort. Hvis du bruker a.id < b.id, fjernes selvparene og speilparet dedupliseres i samme operasjon.

Intervjuere følger spesielt med på valget mellom < og <>; det viser at du forstår kombinatorikken i self joins.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

Finne duplikatrader

For å finne rader som dupliserer hverandre basert på nøkkelkolonner, utfører du en self join på disse kolonnene og krever at primærnøklene er forskjellige.

Her finner vi kunder som deler en e-postadresse. a.id < b.id sørger for at hvert duplikatpar bare vises én gang. Ofte er GROUP BY ... HAVING COUNT(*) > 1 ryddigere, men self join viser de faktiske problemparene side om side.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

Sammenligne tilstøtende rader

En vanlig analytikeroppgave er å sammenligne hver rad med den neste i rekkefølgen, for eksempel hver dags salg med salget fra dagen før. En self join kan koble sammen påfølgende rader.

Her kobler vi hver dag til raden nøyaktig én dag tidligere for å beregne en differanse. Dette fungerer når sekvensen ikke har hull.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

Problemet med manglende rader ved tilstøtende SELF JOIN-er

Den forrige spørringen slutter å fungere hvis en dag mangler: Det finnes ingen rad nøyaktig én dag tidligere, så raden faller ut ved en inner join, eller du må håndtere NULL-verdier.

Dette er grunnen til at intervjuere ofte leder deg mot vindusfunksjoner som LAG for «sammenlign med forrige rad». Disse bruker plasseringen i rekkefølgen i stedet for treff på en verdi, og håndterer hull på en god måte.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

Self join kontra vindusfunksjon

Forstå avveiningen:

  • En self join sammenligner rader basert på en verdirelasjon (samme avdeling, tidligere dato). Den er fleksibel, men kan gi fan-out og håndtere hull feil.
  • En vindusfunksjon sammenligner basert på ordinal posisjon innenfor en sortert partisjon. Den er ryddigere for logikk som gjelder forrige eller neste rad.

For «sammenlign med den tilstøtende raden» bør De foretrekke LAG/LEAD. For «finn alle par som oppfyller en betingelse» er self join det naturlige verktøyet.

Finne rader som gjør det bedre enn kollegene

Et annet mønster er å finne ansatte som tjener mer enn minst én kollega i avdelingen sin. En self join uttrykker dette direkte.

Vi kobler hver ansatt til andre i samme avdeling som tjener mindre, og beholder deretter de unike ansatte som forekommer. Dette kan leses nesten som den engelske setningen.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

Vær oppmerksom på fan-out

Self joins på en kolonne som ikke er unik, multipliserer antallet rader. Kobling av personer i en avdeling med 100 personer gir omtrent 100 x 100 kandidatpar før filtrering.

Ta alltid med predikatet som eliminerer duplikater (a.id < b.id), og legg til DISTINCT eller gruppering når De bare trenger radene som deltar, ikke hvert enkelt par. Nevn denne bevisstheten rundt radmultiplikasjon i intervjuer.

Velge verktøy for sammenligning

Beslutningsguide for sammenligning innad i en tabell:

  • Alle samsvarende par (duplikater, kombinasjoner i samme gruppe): self join med a.id < b.id.
  • Forrige/neste rad i en rekkefølge: vindusfunksjon (LAG/LEAD).
  • Sammenlign hver rad med et gruppeaggregat: korrelert underforespørsel eller vindusaggregat.

Rask sjekk

De ønsker alle unike produktpar som deler samme kategori, uten at et produkt pares med seg selv og uten dupliserte rekkefølger.

Oppsummering: Sammenligne rader i én tabell

Viktigste punkter:

  • Bruk self join på tabellen for å koble dens egne rader sammen når De skal finne duplikater eller kombinasjoner i samme gruppe.
  • Bruk a.id < b.id for å fjerne par med samme rad og speilvendte duplikater i ett predikat.
  • Self join-sammenligninger av nabogrupper bryter sammen når det finnes hull; foretrekk LAG/LEAD for logikk som gjelder forrige eller neste rad.
  • Ta alltid høyde for fan-out når De kobler på kolonner som ikke er unike.
Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Sammenligne rader i én tabell» gratis?

Ja – hele teksten i «Sammenligne rader i én tabell» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til SQL-intervju-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva lærer jeg i «Sammenligne rader i én tabell»?

Mønstre med self-join for å finne par, duplikater og tilstøtende poster. Du øver på Forberedelse til SQL-intervju med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til SQL-intervju?

Ingen tidligere erfaring er nødvendig. Forberedelse til SQL-intervju på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Sammenligne rader i én tabell»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til SQL-intervju-leksjonen?

Ja. Alle Forberedelse til SQL-intervju-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. CROSS JOIN og kartesiske produkter
  2. SELF JOIN for hierarkier
  3. Sammenligne rader i én tabell
  4. Velge riktig join-type
← Tilbake til Forberedelse til SQL-intervju