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
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.
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'.
Toon hint
Gebruik LAG(prijs) OVER(ORDER BY launched_on ASC)
Oplossing beschikbaar na 3 pogingen
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.
Toon hint
LEAD() samen met PARTITION BY en ORDER BY in de OVER.
Oplossing beschikbaar na 3 pogingen