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
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/LEADudtrykker 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, ogLEAD(col)læser den næste, defineret af vinduetsORDER BY.- Valgfrie argumenter:
LAG(col, offset, default). PARTITION BYnulstiller navigationen pr. gruppe, så grænserækkerne bliverNULL.- 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.
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
- LAG og LEAD til tilstødende rækker
- Ændring fra periode til periode
- NTILE til inddeling
- FIRST_VALUE, LAST_VALUE og rammegrænser