Find sekvenshuller i en tabel i Oracle
ProblemDu ønsker at finde alle huller i talrækken eller i datoer og klokkeslæt i dine data. Hullerne kunne
være i datoer, der er registreret for en given handling, eller i andre data med en logisk fortløbende karakter.
Løsning
Oracles LAG- og LEAD OLAP-funktioner giver dig mulighed for at sammenligne den aktuelle række af resultater med en forudgående række.
Det generelle format for LAG ser sådan ud
Lag (kolonne eller udtryk, forskydning af foregående række, standard for første række)
Kolonnen eller udtrykket er den værdi, der skal sammenlignes med haltende (forudgående) værdier. Den foregående
rækkeforskydning angiver, hvor mange rækker forud for den aktuelle række LAG'en skal handle imod. Vi har brugt '1' i
følgende liste til at betyde rækken før den aktuelle række. Standarden for LAG angiver, hvilken
værdi der skal bruges som præcedens for den første række, da der ikke er nogen række nul i en tabel eller et resultat. Vi instruerer Oracle
at bruge 0 som standardankerværdi for at håndtere sagen, hvor vi ser efter dagen før den første i
måneden.
WITH-forespørgselsaliastilgangen kan bruges i næsten alle situationer, hvor en underforespørgsel bruges, for at
flytte underforespørgselsdetaljerne foran hovedforespørgslen. Dette hjælper med at læse koden og omstrukturere koden, hvis det
kræves på et senere tidspunkt.
Denne opskrift ser efter huller i rækkefølgen af dage, hvor ordrer blev foretaget for måneden
November 1999:
med salgsdage som
(vælg udtræk(dag fra ordredato) næste_udsalg,
lag(udtræk(dag fra ordredato),1,0)
over (bestil efter udtræk(dag fra ordredato)) prev_sale
fra oe.orders
hvor ordredato mellem '01-NOV-1999' og '30-NOV-1999')
vælg prev_sale, next_sale
fra salgsdage
hvor next_sale - prev_sale> 1
bestil efter prev_sale;
Vores forespørgsel afslører hullerne, i dage, mellem salg for november måned 1999.
PREV_SALE NEXT_SALE
---------------- ----------
1 10
10 14
15 19
20 22
Resultaterne indikerer, at efter en ordre blev registreret den første i måneden, blev der ikke registreret nogen efterfølgende ordre
før den 10. Derefter fulgte et hul på fire dage til den 14. og så videre. En kloge salgschef
kan godt bruge disse data til at spørge, hvad salgsteamet lavede på disse mellemdage, og hvorfor der ikke kom nogen ordrer
!