Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Podstawyfunkcjiokna
17
byćlepsząopcjąniżwykorzystaniekwerendgrupującychbądźpodrzędnych.Wprzy-
padkuwykorzystaniaagregującychfunkcjioknanietracimyszczegółowychinformacji.
DodefiniowaniaoknadlafunkcjiużywamyklauzuliOVER.Naprzykład,doobliczenia
sumywartościdlawszystkichwierszyzezbioruwynikówkwerendymożemyużyć
następującegoprostegowyrażenia:
SUM(val)OVER()
Jeślinieograniczymyokna(zastosujemypustynawias),rozpoczynamyodzbioru
wynikówkwerendy
.
Doobliczeniasumywartości(val)wszystkichwierszyzezbioruwynikówkwerendy
,
któremająjednakowyidentyfikatorklienta(custid)jakbieżącywiersz,wykorzystu-
jemyelementpartycjonowaniawfunkcjiokna(któryzostanieomówionypóźniej),
przeprowadzającpartycjonowanieoknawedługatrybutucustidwnastępującysposób:
SUM(val)OVER(PARTITIONBYcustid)
Zwracamuwagę,żeterminpartycjonowaniesugerujefiltrowanie,aniegrupowanie.
Przypomocyfunkcjioknamożemypobraćinformacjeszczegółoweizagregowane
dlaklientów,zwracającprocentowyudziałwartościbieżącegozamówieniawsumie
wszystkichzamówieńklienta,jakrównieżróżnicęmiędzywartościąaśredniąwar-
tościązamówieniaklienta(funkcjeoknazostałypogrubione):
SELECTorderid,custid,val,
CAST(100i*val/SUM(val)OVER(PARTITIONBYcustid)ASNUMERIC(5,2))ASpctcust,
val-AVG(val)OVER(PARTITIONBYcustid)ASdiffcust
FROMSalesiOrderValues;
Aotokolejnakwerenda,doktórejdodałemwspółczynnikprocentowegoudziału
wsumiecałkowitejorazróżnicędlaśredniejwartościwszystkichzamówień:
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;
Jakwidać,wersjewykorzystującefunkcjeoknadużokrótszeibardziejzrozumiałe.
Cowięcej,optymalizatorSQLServerzawierakodwyszukującyfunkcjeotejsamejspe-
cyfikacjiokna.WprzypadkuichodnalezieniaSQLServerwykorzystujewnichjedną
isamąoperacjędostępudodanych(niezależnieodwybranegosposobuskanowania).
NaprzykładwzaprezentowanejuprzedniokwerendzieSQLServerwykorzystajedną
operacjędostępudodanychdowyliczeniadwóchpierwszychfunkcji(sumyiśred-
niejpartycjonowanejwedługatrybutucustid)orazdrugąoperacjędostępudodanych
dowyliczeniadwóchostatnichfunkcji(sumyiśredniejbezpartycjonowania).Ten