Lezioni del modulo (4/4)
Spostamenti: LAG e LEAD
Spostamenti: LAG e LEAD
Spesso nei dati sequenziali e temporali, hai bisogno di confrontare la riga in esame con quella del giorno precedente. In SQL "standard", farlo richiede dei pericolosissimi (e lentissimi) Self-Join.
Le funzioni LAG() (riga precedente) e LEAD() (riga successiva) risolvono questo esatto problema con estrema agilità ed eleganza.
Guardare al Passato e al Futuro
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;Nell'esempio, ogni riga avrà comodamente l'importo generato dalla medesima tabella, spostato in avanti di una riga (indietro nel tempo). Possiamo facilmente sottrarre total_amount - LAG(...) per calcolare la differenza o variazioni percentuali mese su mese!
In modo analogo, LEAD() pescherà il valore della riga sottostante l'attuale.
Dalla tabella 'products', estrai 'id', 'launched_on', 'price' e aggiungi 'prev_price', ovvero il 'price' del prodotto logicamente considerato 'precedente', in ordine di 'launched_on' crescente.
Mostra suggerimento
Usa LAG(price) OVER(ORDER BY launched_on ASC)
Soluzione disponibile dopo 3 tentativi
Come calcoleresti i salti di valutazione per singolo utente? Simula: dalla tabella 'reviews' estrai 'customer_id', 'created_at', 'rating' e 'next_rating' (la recensione successiva dello stesso cliente nel tempo). Dunque, partiziona per 'customer_id', ordina per 'created_at' e usa la funzione finestra giusta per sbirciare in avanti.
Mostra suggerimento
LEAD() insieme a PARTITION BY e ORDER BY nell'OVER.
Soluzione disponibile dopo 3 tentativi