Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
18
Rozdział1:FunkcjeoknawjęzykuSQL
procesoptymalizacjizostanieszczegółowoomówionywrozdziale5,„Optymalizacja
funkcjiokna”.
Innąprzewagąfunkcjioknanadkwerendamipodrzędnymijestto,żepoczątkowe
oknoprzedzastosowaniemograniczeńmatakisamzakresjakzbiórwynikówkweren-
dy
.Tooznacza,żepokrywasięonozezbioremwynikówpozastosowaniuoperatorów
(np.JOIN),filtrów,grupowaniaiinnych.Takizbiórwynikówuzyskujemyzewzględu
nafazęlogicznegoprzetwarzaniakwerendy
,wktórejwykonanezostająfunkcjeokna
(zagadnienietozostanieomówionewdalszejczęścitegorozdziału).Natomiastkwe-
rendapodrzędnarozpoczynaodsamegopoczątku,nieodzbioruwynikówzewnętrz-
nejkwerendy
.Wkonsekwencji,jeślichcemy
,abykwerendapodrzędnaprzetwarzała
tesamewierszecozbiórwynikówkwerendyzewnętrznej,musimypowtórzyćwniej
wszystkiekonstrukcjewykorzystywanewkwerendziezewnętrznej.Dlaprzykładu
załóżmy
,żechcemy
,abywyliczeniaudziałuprocentowegowsumiecałkowitejoraz
różnicydlaśredniejodnosiłysięjedyniedlazamówieńzłożonychwroku2018.Jeśli
wykorzystujemyfunkcjeokna,wystarczy
,żedodamydokwerendyjedenfiltr:
SELECTorderid,custid,val,
CAST(100i*val/SUM(val)OVER(PARTITIONBYcustid)ASNUMERIC(5,2))ASpctcust,
val-AVG(val)OVER(PARTITIONBYcustid)ASdiffcust,
CAST(100i*val/SUM(val)OVER()ASNUMERIC(5,2))ASpctall,
val-AVG(val)OVER()ASdiffall
FROMSalesiOrderValues
WHEREorderdate>='20180101'
ANDorderdate<'20190101';
Wszystkiefunkcjeoknarozpoczynająprzetwarzanieodzbiorupozastosowaniufil-
tra,wprzeciwieństwiedokwerendpodrzędnych,którerozpoczynająodpoczątku
idlategowymagająpowtórzeniafiltrawewszystkichkwerendachpodrzędnych,jak
wListingu4:
Listing1-4Powtarzaniefiltruwewszystkichpodkwerendach
SELECTorderid,custid,val,
CAST(100i*val/
(SELECTSUM(O2ival)
FROMSalesiOrderValuesASO2
WHEREO2icustid=O1icustid
ANDorderdate>='20180101'
ANDorderdate<'20190101')ASNUMERIC(5,2))ASpctcust,
val-(SELECTAVG(O2ival)
FROMSalesiOrderValuesASO2
WHEREO2icustid=O1icustid
ANDorderdate>='20180101'
ANDorderdate<'20190101')ASdiffcust,
CAST(100i*val/
(SELECTSUM(O2ival)
FROMSalesiOrderValuesASO2
WHEREorderdate>='20180101'