Forberedelse til kodeinterviews · Lektion

LAG og LEAD til tilstødende rækker

Få adgang til værdier i den forrige og næste række uden et self-join

Lektion 1 af 413 trin

LAG og LEAD til tilstødende rækker er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 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 kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Spørgsmålet, interviewere stiller

Et af de mest almindelige spørgsmål til analytikerinterviews er: „Sammenlign hver række med den foregående uden et selvjoin.“ Tænk på omsætning fra måned til måned, en brugers forrige login eller den næste hændelse i en sekvens.

Det klare svar er vinduesfunktionerne LAG og LEAD. De giver en række mulighed for at se værdien i en naborække, samtidig med at alle detaljerækker bevares. I denne lektion opbygger du en præcis forståelsesmodel for, hvordan de navigerer mellem tilstødende rækker.

Hvad LAG og LEAD gør

LAG(col) returnerer værdien af col fra den forrige række. LEAD(col) returnerer værdien fra den næste række. „Forrige“ og „næste“ defineres udelukkende af ORDER BY i OVER-klausulen.

  • LAG ser bagud.
  • LEAD ser fremad.

Begge er forskydningsvinduesfunktioner: De sammenlægger aldrig rækker, men føjer blot en naborækkes værdi til den aktuelle række.

Grundlæggende LAG-syntaks

Her er den grundlæggende form. Vi har en sales-tabel med en month- og en revenue-kolonne. Vi vil også vise den foregående måneds omsætning på hver række.

OVER (ORDER BY month) fortæller databasesystemet, hvordan „forrige“ skal defineres. Den første række har ingen forgænger, så prev_revenue er NULL dér.

SELECT
  month,
  revenue,
  LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;

Læsning af resultatet

For dataene 2024-01 = 100, 2024-02 = 130, 2024-03 = 120 returnerer forespørgslen:

  • jan.: omsætning 100, prev_revenue NULL
  • feb.: omsætning 130, prev_revenue 100
  • mar.: omsætning 120, prev_revenue 130

Hver række hentede værdien fra rækken lige ovenover i det sorterede sæt. Intet selvjoin, ingen underforespørgsel og ingen mistede rækker.

LEAD ser fremad

LEAD er spejlbilledet. Brug den, når en række skal vide, hvad der kommer bagefter, for eksempel den næste købsdato for at beregne tiden mellem ordrer.

Den sidste række i det sorterede sæt har ingen efterfølger, så dens LEAD-resultat er NULL.

SELECT
  month,
  revenue,
  LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;

Argumentet for forskydningen

Begge funktioner tager et valgfrit andet argument: hvor mange rækker der skal springes over. LAG(col, 2) går to rækker tilbage, og LEAD(col, 3) springer tre rækker frem.

Interviewere bruger dette til for eksempel at spørge efter „omsætningen for to måneder siden“ eller „værdien tre rækker nede“. Standardforskydningen er 1.

SELECT
  month,
  revenue,
  LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;

Argumentet for standardværdien

Et tredje argument angiver en erstatningsværdi, når der ikke findes en naborække, i stedet for at få NULL. Signaturen er LAG(col, offset, default).

Det er praktisk, når en efterfølgende beregning ikke kan håndtere NULL, for eksempel hvis den manglende forrige værdi skal behandles som 0, så en forskel stadig kan beregnes.

SELECT
  month,
  revenue,
  LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;

PARTITION BY nulstiller vinduet

Virkelige data består sjældent af én global serie. Du sammenligner normalt inden for hver kunde, hvert produkt eller hver region. PARTITION BY genstarter LAG/LEAD-beregningen ved begyndelsen af hver partition.

Det betyder, at den første række i hver partition får NULL fra LAG, så en værdi aldrig slipper over grænsen ind i en anden kundes data.

SELECT
  customer_id,
  order_date,
  amount,
  LAG(amount) OVER (
    PARTITION BY customer_id
    ORDER BY order_date
  ) AS prev_amount
FROM orders;

Gennemgået eksempel: Dage mellem ordrer

En hyppig opgave er at måle afstanden mellem en kundes efterfølgende ordrer. Hent datoen for den foregående ordre med LAG, og træk derefter fra.

Den første ordre for hver kunde giver NULL, fordi der ikke findes en tidligere dato at trække fra. Det er netop den slags sammenligning pr. kunde, som interviewere forventer, at vinduesfunktioner løser.

SELECT
  customer_id,
  order_date,
  order_date - LAG(order_date) OVER (
    PARTITION BY customer_id
    ORDER BY order_date
  ) AS days_since_prev
FROM orders;

Hvorfor ikke et selvjoin

Før vinduesfunktioner fandtes, løste man det med et korreleret selvjoin: sammenføj tabellen med sig selv på "den række, hvis dato er den største under denne". Det virker, men er omstændeligt, fejlbehæftet ved ens datoer og ofte langsommere.

  • LAG/LEAD udtrykker hensigten på én linje.
  • De beregnes i én enkelt sorteret gennemgang.
  • Ens datoer afgøres deterministisk af din ORDER BY.

At sige "Jeg ville bruge LAG i stedet for et selvjoin" signalerer fortrolighed.

Almindelig faldgrube: Manglende ORDER BY

Uden en ORDER BY i OVER-klausulen er "forrige række" udefineret. Nogle databasemotorer afviser det, mens andre returnerer uforudsigelige resultater. Sortér altid vinduet.

Husk også, at sorteringen inde i OVER er uafhængig af forespørgslens ydre ORDER BY. Vinduet afgør, hvilken række der er naboen; den ydre klausul afgør kun visningsrækkefølgen.

Hurtig kontrol

Kontrollér din forståelse af vinduesfunktioner med forskydning.

Opsummering

Du kender nu vinduesfunktionerne med forskydning:

  • LAG(col) læser den forrige række, og LEAD(col) læser den næste, defineret af vinduets ORDER BY.
  • Valgfrie argumenter: LAG(col, offset, default).
  • PARTITION BY nulstiller navigationen pr. gruppe, så grænserækkerne bliver NULL.
  • De erstatter klodsede selvjoins, når du skal sammenligne tilstødende rækker.

Næste gang anvender vi dette på det garanterede analytikerspørgsmål: ændring fra periode til periode.

Gratis at komme i gang

Lær Forberedelse til kodeinterviews 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
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “LAG og LEAD til tilstødende rækker” gratis?

Ja — hele teksten til “LAG og LEAD til tilstødende rækker” 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 kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “LAG og LEAD til tilstødende rækker”?

Få adgang til værdier i den forrige og næste række uden et self-join Du øver dig i Forberedelse til kodeinterviews 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 kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews 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 1 af 4.

Hvor lang tid tager lektionen “LAG og LEAD til tilstødende rækker”?

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 kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-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. LAG og LEAD til tilstødende rækker
  2. Ændring fra periode til periode
  3. NTILE til inddeling
  4. FIRST_VALUE, LAST_VALUE og rammegrænser
← Tilbage til Forberedelse til kodeinterviews