sql >> Databasteknik >  >> RDS >> Oracle

Hitta sekvensluckor i en tabell i Oracle

Hitta sekvensluckor i en tabell i Oracle

Problem
Du vill hitta alla luckor i nummersekvensen eller i datum och tider i din data. Luckorna kan
finnas i datum som registrerats för en given åtgärd, eller i någon annan data med logiskt konsekutiv karaktär.
Lösning
Oracles LAG- och LEAD OLAP-funktioner låter dig jämföra den aktuella raden med resultat med en föregående rad.
Det allmänna formatet för LAG ser ut så här
Lag (kolumn eller uttryck, föregående radförskjutning, standard för första raden)
Kolumnen eller uttrycket är värdet som ska jämföras med eftersläpande (föregående) värden. Den föregående
radförskjutningen anger hur många rader före den aktuella raden LAG-gruppen ska agera mot. Vi har använt "1" i
följande lista för att betyda raden ett före den aktuella raden. Standardvärdet för LAG anger vilket
värde som ska användas som prejudikat för den första raden, eftersom det inte finns någon rad noll i en tabell eller ett resultat. Vi instruerar Oracle
att använda 0 som standardankarvärde för att hantera fallet där vi letar efter dagen före den första i
månaden.
Med frågealiasmetod kan användas i nästan alla situationer där en underfråga används, för att
flytta underfrågans detaljer före huvudfrågan. Detta underlättar läsbarhet och omstrukturering av koden om
krävs vid ett senare tillfälle.
Det här receptet letar efter luckor i sekvensen av dagar då beställningar gjordes för månaden
november 1999:

med försäljningsdagar som
(välj extrakt(dag från order_datum) nästa_försäljning,
lag(utdrag(dag från orderdatum),1,0)
över (order efter utdrag(dag från orderdatum)) prev_sale
från oe.orders
där order_datum mellan '01-NOV-1999' och '30-NOV-1999')
välj prev_sale, next_sale
från försäljningsdagar
där next_sale - prev_sale> 1
beställ genom prev_sale;
Vår fråga avslöjar gapen, i dagar, mellan försäljningen för november månad 1999.

PREV_SALE NEXT_SALE
---------------- ----------
1 10
10 14
15 19
20 22
Resultaten visar att efter att en beställning registrerats den första i månaden, registrerades ingen efterföljande beställning
förrän den 10:e. Sedan följde en fyra dagars lucka till den 14, och så vidare. En skarpsinnig försäljningschef
kan mycket väl använda denna information för att fråga vad säljteamet gjorde under dessa mellandagar och varför inga beställningar
kom in!

  1. Komma igång med GearHost för MySQL-databasutveckling

  2. Hur använder man Oracle ORDER BY och ROWNUM korrekt?

  3. Lägg till datumparameter till Oracle-frågan

  4. Kontrollera överlappning av datumintervall i MySQL