Trovare intervalli di sequenza in una tabella in Oracle
ProblemaVuoi trovare tutti gli spazi vuoti nella sequenza di numeri o in date e orari nei tuoi dati. Le lacune potrebbero
essere nelle date registrate per una determinata azione o in altri dati di natura logicamente consecutiva.
Soluzione
Le funzioni LAG e LEAD OLAP di Oracle consentono di confrontare la riga di risultati corrente con una riga precedente.
Il formato generale di LAG è simile a questo
Lag (colonna o espressione, offset di riga precedente, valore predefinito per la prima riga)
La colonna o l'espressione è il valore da confrontare con valori in ritardo (precedenti). L'offset di riga
precedente indica quante righe prima della riga corrente deve agire il LAG. Abbiamo usato '1' nel
elenco seguente per indicare la riga uno prima della riga corrente. L'impostazione predefinita per LAG indica quale
valore utilizzare come precedente per la prima riga, poiché non esiste una riga zero in una tabella o in un risultato. Indichiamo a Oracle
di utilizzare 0 come valore di ancoraggio predefinito, per gestire il caso in cui cerchiamo il giorno prima del primo del
mese.
È possibile utilizzare l'approccio dell'alias di query WITH in quasi tutte le situazioni in cui viene utilizzata una sottoquery, per
riposizionare i dettagli della sottoquery prima della query principale. Ciò facilita la leggibilità e il refactoring del codice se
richiesto in un secondo momento.
Questa ricetta cerca le lacune nella sequenza dei giorni in cui sono stati effettuati gli ordini per il mese di
novembre 1999:
con salesdays come
(select extract(day from order_date) next_sale,
lag(extract(day from order_date),1,0)
over (order by extract(day from order_date)) prev_sale
da oe.orders
dove order_date tra '01-NOV-1999' e '30-NOV-1999')
seleziona prev_sale, next_sale
da saldi
dove next_sale - prev_sale> 1
ordine per prev_sale;
La nostra query mostra i divari, in giorni, tra le vendite del mese di novembre 1999.
PREV_SALE NEXT_SALE
---------- ----------
1 10
10 14
15 19
20 22
I risultati indicano che dopo che un ordine è stato registrato il primo del mese, nessun ordine successivo
è stato registrato fino al 10. Poi è seguito un gap di quattro giorni fino al 14 e così via. Un astuto responsabile delle vendite
potrebbe benissimo utilizzare questi dati per chiedere cosa stava facendo il team di vendita in quei giorni di pausa e perché non sono arrivati ordini
!