Direct naar de hoofdinhoud
Module 13 · Les 4 van 452/57 in de cursus~12 min
Modulelessen (4/4)

Ploegen: LAG en LEAD

Ploegen: LAG en LEAD

Bij sequentiële en op tijd gebaseerde gegevens moet u vaak de huidige rij vergelijken met die van de vorige dag. In "standaard" SQL vereist dit zeer gevaarlijke (en zeer langzame) self-joins.

De functies LAG() (vorige rij) en LEAD() (volgende rij) lossen precies dit probleem op met extreme behendigheid en elegantie.

Kijkend naar het verleden en de toekomst

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

In het voorbeeld draagt ​​elke rij handig het bedrag dat door dezelfde tafel wordt geproduceerd, één rij vooruit geschoven (terug in de tijd). We kunnen eenvoudig total_amount - LAG(...) aftrekken om het verschil of de procentuele veranderingen per maand te berekenen!

Op dezelfde manier haalt LEAD() de waarde uit de rij direct onder de huidige.

Oefening#sql.m13.l4.e1
Pogingen: 0Laden…

Uit de tabel 'producten' extraheert u 'id', 'launched_on', 'price' en voegt u 'prev_price' toe, d.w.z. de 'prijs' van het product dat logischerwijs als de 'vorige' wordt beschouwd, in oplopende volgorde van 'launched_on'.

Editor laden…
Toon hint

Gebruik LAG(prijs) OVER(ORDER BY launched_on ASC)

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m13.l4.e2
Pogingen: 0Laden…

Hoe zou u de beoordelingssprongen per individuele gebruiker berekenen? Simuleer het: uit de tabel 'reviews' extraheer je 'customer_id', 'created_at', 'rating' en 'next_rating' (de volgende review van dezelfde klant in de loop van de tijd). Dus verdeel op 'customer_id', bestel op 'created_at' en gebruik de juiste vensterfunctie om vooruit te kijken.

Editor laden…
Toon hint

LEAD() samen met PARTITION BY en ORDER BY in de OVER.

Oplossing beschikbaar na 3 pogingen