Rechercher des écarts de séquence dans une table dans Oracle
ProblèmeVous souhaitez trouver toutes les lacunes dans la séquence de nombres ou dans les dates et heures de vos données. Les écarts peuvent
être dans les dates enregistrées pour une action donnée, ou dans d'autres données de nature logiquement consécutive.
Solution
Les fonctions LAG et LEAD OLAP d'Oracle vous permettent de comparer la ligne actuelle de résultats avec une ligne précédente.
Le format général de LAG ressemble à ceci
Retard (colonne ou expression, décalage de la ligne précédente, par défaut pour la première ligne)
La colonne ou l'expression est la valeur à comparer avec des valeurs en retard (précédentes). Le
décalage de la ligne précédente indique le nombre de lignes avant la ligne actuelle sur laquelle le LAG doit agir. Nous avons utilisé "1" dans
la liste suivante pour désigner la ligne qui précède la ligne actuelle. La valeur par défaut pour LAG indique la
valeur à utiliser comme précédent pour la première ligne, car il n'y a pas de ligne zéro dans une table ou un résultat. Nous demandons à Oracle
d'utiliser 0 comme valeur d'ancrage par défaut, pour gérer le cas où nous recherchons le jour précédant le
premier du mois.
L'approche d'alias de requête WITH peut être utilisée dans presque toutes les situations où une sous-requête est utilisée, pour
déplacer les détails de la sous-requête avant la requête principale. Cela facilite la lisibilité et la refactorisation du code si
nécessaire à une date ultérieure.
Cette recette recherche les écarts dans la séquence des jours où les commandes ont été passées pour le mois de
novembre 1999 :
avec des jours de vente comme
(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
à partir de oe.orders
où order_date entre '01-NOV-1999' et '30-NOV-1999')
sélectionnez prev_sale, next_sale
à partir de salesdays
où next_sale - prev_sale> 1
trier par prev_sale;
Notre requête expose les écarts, en jours, entre les ventes du mois de novembre 1999.
PREV_SALE NEXT_SALE
---------- ----------
1 10
10 14
15 19
20 22
Les résultats indiquent qu'après qu'une commande a été enregistrée le premier du mois, aucune commande ultérieure
n'a été enregistrée avant le 10. Puis un écart de quatre jours a suivi jusqu'au 14, et ainsi de suite. Un directeur des ventes avisé
pourrait utiliser ces données pour demander ce que faisait l'équipe de vente pendant ces jours de pause, et pourquoi aucune commande
n'est arrivée !