Auffinden von Sequenzlücken in einer Tabelle in Oracle
ProblemSie möchten alle Lücken in der Zahlenfolge oder in Datums- und Zeitangaben in Ihren Daten finden. Die Lücken könnten
in Daten liegen, die für eine bestimmte Aktion aufgezeichnet wurden, oder in anderen Daten mit logisch aufeinander folgender Natur.
Lösung
Mit den LAG- und LEAD-OLAP-Funktionen von Oracle können Sie die aktuelle Ergebniszeile vergleichen mit einer vorangehenden Zeile.
Das allgemeine Format von LAG sieht so aus
Lag (Spalte oder Ausdruck, Offset der vorangehenden Zeile, Standard für die erste Zeile)
Die Spalte oder der Ausdruck ist der zu vergleichende Wert mit nacheilenden (vorhergehenden) Werten. Der vorangehende
Zeilenoffset gibt an, wie viele Zeilen vor der aktuellen Zeile die LAG bearbeiten soll. Wir haben ‚1‘ in
der folgenden Auflistung verwendet, um die Zeile vor der aktuellen Zeile zu bezeichnen. Der Standardwert für LAG gibt an, welcher
Wert als Präzedenzfall für die erste Zeile verwendet werden soll, da es in einer Tabelle oder einem Ergebnis keine Zeile Null gibt. Wir weisen Oracle an,
den standardmäßigen Ankerwert 0 zu verwenden, um den Fall zu handhaben, in dem wir nach dem Tag vor dem ersten des
Monats suchen.
Der WITH-Abfrage-Alias-Ansatz kann verwendet werden in fast allen Situationen, in denen eine Unterabfrage verwendet wird, um
die Details der Unterabfrage vor die Hauptabfrage zu verschieben. Dies erleichtert die Lesbarkeit und das Refactoring des Codes, falls
später erforderlich.
Dieses Rezept sucht nach Lücken in der Reihenfolge der Tage, an denen Bestellungen für den Monat
November 1999 getätigt wurden:
mit Verkaufstagen als
(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
von oe.orders
where order_date between '01-NOV-1999' and '30-NOV-1999')
select prev_sale, next_sale
from salesdays
where next_sale - prev_sale> 1
order by prev_sale;
Unsere Abfrage zeigt die Lücken in Tagen zwischen den Verkäufen für den Monat November 1999.
PREV_SALE NEXT_SALE
---------- ----------
1 10
10 14
15 19
20 22
Die Ergebnisse zeigen, dass, nachdem eine Bestellung am Ersten des Monats erfasst wurde, keine weitere Bestellung
bis zum 10. erfasst wurde. Dann folgte eine viertägige Pause bis zum 14. und so weiter. Ein schlauer Verkaufsleiter
kann diese Daten durchaus verwenden, um zu fragen, was das Verkaufsteam an diesen Lückentagen tat und warum keine Bestellungen
eingingen!