Vai al contenuto
eLearner.app
Modulo 13 · Lezione 4 di 452/57 nel corso~12 min
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

SQL
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.

Esercizio#sql.m13.l4.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa LAG(price) OVER(ORDER BY launched_on ASC)

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m13.l4.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

LEAD() insieme a PARTITION BY e ORDER BY nell'OVER.

Soluzione disponibile dopo 3 tentativi