Hledání mezer v sekvencích v tabulce v Oracle
ProblémChcete najít všechny mezery v posloupnosti čísel nebo v datech a časech ve vašich datech. Mezery mohou
být v datech zaznamenaných pro danou akci nebo v některých jiných datech s logicky po sobě jdoucí povahou.
Řešení
Funkce LAG a LEAD OLAP společnosti Oracle umožňují porovnat aktuální řadu výsledků s předchozím řádkem.
Obecný formát LAG vypadá takto
Prodleva (sloupec nebo výraz, posunutí předchozího řádku, výchozí pro první řádek)
Sloupec nebo výraz je hodnota, která se má porovnat se zpožděnými (předchozími) hodnotami. Posun předchozího
řádku udává, proti kolika řádkům před aktuálním řádkem by měla MAS působit. „1“ jsme v
následujícím výpisu použili k označení prvního řádku před aktuálním řádkem. Výchozí hodnota pro LAG udává, jakou
hodnotu použít jako precedens pro první řádek, protože v tabulce nebo výsledku není žádný řádek nula. Instruujeme společnost Oracle
, aby použila 0 jako výchozí hodnotu kotvy, abychom zvládli případ, kdy hledáme den předcházející prvnímu z
měsíce.
Lze použít přístup WITH alias dotazu téměř ve všech situacích, kdy se používá poddotaz, k
přemístění podrobností poddotazu před hlavním dotazem. To napomáhá čitelnosti a refaktorizaci kódu, bude-li to
požadováno později.
Tento recept hledá mezery v posloupnosti dnů, kdy byly provedeny objednávky pro měsíc
listopad 1999:
s prodejními dny jako
(vyberte extrakt(den od data_objednávky) další_prodej,
lag(extrakt(den od_datu_objednávky),1,0)
přes (objednat podle výpisu(den od_datu_objednávky)) předchozí_prodej
z oe.orders
kde datum_objednavky mezi '01-NOV-1999' a '30-NOV-1999')
vyberte prev_sale, next_sale
od salesdays
kde next_sale - prev_sale> 1
order by prev_sale;
Náš dotaz odhaluje mezery ve dnech mezi prodejem za měsíc listopad 1999.
PŘEDCHOZÍ_PRODEJ DALŠÍ_PRODEJ
---------- ----------
1 10
10 14
15 19
20 22
Výsledky naznačují, že po zaznamenání objednávky prvního v měsíci nebyla do 10. dne zaznamenána žádná další objednávka
. Pak následovala čtyřdenní mezera do 14. a tak dále. Důmyslný manažer prodeje
může tato data použít k tomu, aby se zeptal, co prodejní tým dělal v těchto dnech a proč žádné objednávky
nepřicházely!