Monday 20 November 2017

Oracle Sql Eksponentiell Moving Average


Hvis du ser denne meldingen, har nettleseren enten deaktivert eller ikke støtter JavaScript. For å bruke de fulle funksjonene i dette hjelpesystemet, for eksempel søk, må nettleseren din ha JavaScript-støtte aktivert. Veidede Flytende Gjennomsnitt Med Enkle Flytende Gjennomsnitt, blir hver dataverdi i kvotenavgiften der beregningen utføres, gitt likeverdig eller vekt. Det er ofte tilfelle, særlig i økonomisk prisdataanalyse, at mer kronologisk nylig data skal bære større vekt. I disse tilfellene, er vektet bevegelige gjennomsnitt (eller eksponentielt flytende gjennomsnitt - se følgende emne) ofte foretrukket. Vurder det samme tabellen med salgsdataverdier i tolv måneder: Å beregne et veidende flytende gjennomsnitt: Beregn hvor mange dataintervaller som deltar i beregningen av flytende gjennomsnitt (dvs. størrelsen på beregningen kvotering). Hvis beregningsvinduet sies å være n, multipliseres den nyeste dataverdien i vinduet med n, den nest siste multiplisert med n-1, verdien før det multipliseres med n-2 og så videre for alle verdier i vinduet. Del summen av alle de multipliserte verdiene med summen av vektene for å gi vektet flytende gjennomsnitt over det aktuelle vinduet. Plasser vektet Flytende gjennomsnittsverdi i en ny kolonne i henhold til den gjennomsnittlige posisjonen som er beskrevet ovenfor. For å illustrere disse trinnene bør du vurdere om en 3-måneders vektet flyttende gjennomsnittlig omsetning i desember kreves (ved hjelp av tabellen over salgsverdier ovenfor). Begrepet quot3-monthquot innebærer at beregningen quotwindowquot er 3, derfor bør den vektede flytende gjennomsnittlige beregningsalgoritmen for denne saken være: Eller hvis et 3-måneders veidende flytende gjennomsnitt ble evaluert over hele det opprinnelige dataområdet, ville resultatene være : 3-måneders veiing Gjennomsnittlig eksponentiell flytende gjennomsnitt Det var et fint spørsmål om OTN i dag om det finnes en standard Oracle-funksjon for å beregne eksponentielt glidende gjennomsnitt. Svaret er at det ikke finnes en slik funksjon, men med modellklausulen kan du beregne det veldig enkelt. Og det er et godt eksempel på hva jeg mener med variabelt antall beregninger basert på beregnede verdier, skrevet i min tredje del av modellklausulen opplæringen. Før i dag visste jeg ikke engang hva et eksponentielt glidende gjennomsnitt var akkurat. Du kan lese mer om det her på Wikipedia eller her med et godt eksempel. Fra den første lenken: Et eksponentielt glidende gjennomsnitt (EMA), gjelder vektningsfaktorer som reduseres eksponentielt. Vektingen for hvert eldre datapunkt faller eksponentielt, noe som gir mye større betydning for de siste observasjonene, mens det fortsatt ikke fjernes eldre observasjoner helt. Fra den andre lenken: Formelen for å beregne et eksponentielt flytende gjennomsnitt (EMA) er: X Gjeldende EMA (dvs. EMA skal beregnes) C Gjeldende originaldataverdi K Glatting Konstant P Tidligere EMA (Den første EMA i området som skal beregnes er vilkårlig og kan være den tilsvarende opprinnelige dataverdien eller ofte en enkel flytende gjennomsnittsverdi. K utjevning konstant 2 (1 n) Og denne formelen følges av et eksempel som jeg utvidet litt ved hjelp av dette tabellen: Rekordene fra produkt A matcher eksemplet i lenken. Jeg skrev opp tallene fra produkt B. Her er modellklausul-spørringen som implementerer formelen. Legg merke til hvordan formelen direkte oversetter til den eneste regelen av modellklausulen. Utjevningskonstanten K er satt til .5, basert på et verdifall (n) som tilsvarer 3. Utfordring: prøv dette uten modellklausulen og se om du kan komme opp med noe mer omfattende. 5 kommentarer: 11.2 funksjoner i bruk med dat som (velg 39A39 produkt . dato 392009-01-0139 måned, 10 beløp fra dobbelt union alle velger 39A39, dato 392009-02-0139, 15 fra dobbelt union alle velg 39A39, dato 392009-03-0139, 17 fra dual union alle velg 39A39, dato 392009-04-0139, 20 fra dual union alt velg 39A39, dato 392009-05-0139, 22 fra dobbelt union alle velg 39A39, dato 392009-06-0139, 20 fra dual union alle velg 39A39, dato 392009-07-0139, 25 fra dual union alle velg 39A39, dato 392009-08-0139, 27 fra dual union alle velger 39A39, dato 392009-09-0139, 30 fra dual union alle velg 39A39, dato 392009-10-0139, 35 fra dual union alle velg 39A39, dato 392009-11-0139 , 37 fra dual union alle velger 39A39, dato 392009-12-0139, 40 fra dual union alle velg 39B39, dato 392009-01-0139, 0 fra dual union alle velg 39B39, dato 392009-02-0139, 50 fra dual union alt velg 39B39, dato 392009-03-0139, 10 fra dobbelt union alle velg 39B39, dato 392009-04-0139, 40 fra dual union alle velg 39B39, dato 392009-05-0139, 15 fra dobbelt union alle velg 39B39, dato 392009-06-0139, 35 fra dual union all select 39B39, date 392009-07-0139, 30 fra dual union alle velg 39B39, dato 392009-08-0139, 30 fra dual union alle velg 39B39, dato 392009-09-0139, 20 fra dual union alle velg 39B39 , dato 392009-10-0139, 20 fra dual union alle velg 39B39, dato 392009-11-0139, 20 fra dual union alle velg 39B39, dato 392009-12-0139, 20 fra dual), rns as (velg dat. . rownumber () over (partisjon etter produkt rekkefølge etter måned) rn -. 2 (1count () over (partisjon etter produkt)) k. 0,5 k fra dat), res (produkt, måned, mengde, rn, x) som (velg r. product, r. month, r. amount, r. rn, r. amount x fra rns r hvor rn 1 union alle velger ns. product, ns. month, ns. amount, ns. rn, ns. k (ns. amount - es. x) es. xx fra rns ns, res es hvor ns. rn es. rn 1 og ns. product es. produkt) velg produkt, måned, mengde, rn, runde (x, 3) EMA fra resordre etter produkt, måned etter beregning av lukket form Jeg kom opp med følgende kode som hvis mer som en forvirring enn noe omfattende. Tanken er å skape kjøremultipler ved hjelp av en strengkontekst og xml-eval-funksjonaliteten. De lukkede formene av de spesielle tilfellene trenger bare løpende beløp. Det er en generell sak og to spesielle tilfeller som er mye enklere: med t1 som (velg produkt, måned, beløp, mengde ci, rownumber () over (partisjon etter produkt rekkefølge etter måned) rn, --2 (1 rownumber (divisjon etter produkt rekkefølge etter måned)) ki 0,5 ki fra salg), t2 som (velg produkt, måned, beløp, (tilfelle når rn 1 deretter 1 annet ki ende ci) ai, tilfelle når rn 1 deretter 1 annet (1 - ki) end bi fra t1), t3 som (VELG produkt, MÅNED, mengde, ai, xmlquery (REPLASJON (wmconcat (bi) over (DELISJON AV produkt ORDER PER MÅNEDRER MELLOM ubundet foregående og HØYRE RØD), 39,39, 3939 ) RETURNING innhold).getnumberval () mi FRA t2), t4 som (velg produkt, måned, beløp, mi, (ai mi) xi fra t3) VELG produkt, MÅNED, mengde, runde (mi SUM (xi) over AV produkt ORDER PER MÅNEDER ROR MELLOM Ubundet FORGÅENDE OG HØYRE RÅD) 3) EMA FRA T4 Spesiell sak K 0.5: Med t1 as (velg produkt, måned, beløp, rownumber () over (partisjon etter produkt rekkefølge etter måned) kraft (2, nvl (nullif (r egenkapital () over (deling etter produkt rekkefølge etter måned) - 1, 0), 1)) ci fra salg) velg produkt, måned, beløp, runde (sum (ci) over (partisjon etter produktbestilling etter månedrader mellom ubundet foregående og nåværende rad) strøm (2, rn), 3) ema fra t1 Spesiell sak K 2 (1 i): med t1 as (velg produkt, måned, beløp, rownumber () over (partisjon etter produkt rekkefølge etter måned) mengde rownumber () over (partisjon etter produkt rekkefølge etter måned) ci fra salg) velg produkt, måned, beløp, runde (sum (ci) over (partisjon etter produkt rekkefølge etter måned rader mellom ubundet foregående og nåværende rad) 2 rn 1)), 3) ema fra t1 I39ll legger inn beviset på lukket form hvis noen er interessert i det. Dette er et godt eksempel på quote med SQLquot :-) En kombinasjon av XMLQuery, den ukodede wmconcat og analytiske funksjoner med windowing-klausulen. Jeg liker det. Selv om det ikke er så omfattende som modellklausulvarianten og Rafu39s rekursiv med en, som du sa selv. Og jeg vil gjerne se beviset på den lukkede skjemaet. Jeg taklet et annet spørsmål: hvordan optimalisere utjevningskonstanten SELECT k - utjevningskonstanten. mse - gjennomsnittlig kvadratfeil FRA (velg fra salg MODELL DIMENSJON AV (produkt. ROWNUMBER () OVER (DELISJON AV PRODUKT ORDER AV MÅNED ASC) RN) TILGJENGELIGHETER (beløp - salgsbeløp. måned - måned 0 AS C. 0 AS P. 0 AS X. 0 AS SE - kvadratfeil - - arbeidsrad og attributter - a) arbeidsrad er produkt 39X39, rn 1 - b) arbeidsattributter er som følger:. 0 AS SSE - sum SE for alle produktmønster. 0 AS MSE - betyr SSE for alle produktsmonter. 0 AS k - for alle produktmønster. 0 AS PreMSE - tidligere k39s MSE for alle produktmønster. 0 AS diff - mellom nåværende MSE og tidligere. 0,1 AS delta - innledende inkrement. 0 AS priorit - startpunkt -) REGLER ITERATE (99) TIL (abs (diff39A39,1) lt 0.00010) (Cany, rn sumcv (), cv (). K39A39,1 priorert39A39,1 delta39A39,1. Xany , rn BESTILL BY produkt, rn ASC COALESCE (K39A39,1 Ccv (), cv () (1-K39A39,1) Xcv (), cv () - 1, Ccv (), cv ()).Produkt, rn Xcv (), cv () - 1. SEprodukt, rn POWER (Ccv (), cv () - Xcv (), cv () - 1, 2).SSE39A39,1 SUM (SE) noen, noen. MSE39A39,1 SUM (SE) noen, noen 24. diff39A39,1 CASE iterasjonsnummer når 0 da NULL ELSE preMSE39A39,1 - MSE39A39,1 END. PreMSE39A39,1 MSE39A39,1. Delta39A39,1 tilfelle når diff39A39,1 lt 0 THEN - abs (delta39A39, 12) ELSK abs (delta39A39,1) END .39A39,1 K39A39,1)) hvor produkt 39A39 og rn 1 K MSE ---------- ---------- .599999237 174.01609421 SQL for analyse og rapportering Behandling av NULLs som Input til Window Funksjoner Window funksjoner NULL semantikk samsvarer med NULL semantikk for SQL aggregat funksjoner. Andre semantikk kan hentes med brukerdefinerte funksjoner, eller ved å bruke DECODE - eller CASE-uttrykket i vindufunksjonen. Windowing Funksjoner med Logisk Offset En logisk offset kan spesifiseres med konstanter som RANGE 10 PRECEDING. eller et uttrykk som evaluerer til en konstant, eller ved en intervallspesifikasjon som RANGE INTERVAL N DAY MONTH YEAR PRECEDING eller et uttrykk som evaluerer til et intervall. Med logisk forskyvning kan det bare være ett uttrykk i ORDER BY-uttrykkslisten i funksjonen, med type kompatibel med NUMERIC hvis forskyvning er numerisk, eller DATE hvis et intervall er spesifisert. Eksempel 21-7 Kumulativ aggregatfunksjon Følgende er et eksempel på kumulative mengder av kunde-ID etter kvartal i 1999: I dette eksemplet definerer den analytiske funksjonen SUM for hver rad et vindu som starter i begynnelsen av partisjonen (UNBOUNDED PRECEDING ) og slutter som standard i den nåværende raden. Nested SUM s er nødvendig i dette eksemplet siden vi utfører en SUM over en verdi som er seg selv en SUM. Nestede aggregater brukes ofte i analytiske aggregatfunksjoner. Eksempel 21-8 Moving Aggregate Function Dette eksempelet på et tidsbasert vindu viser for en kunde det glidende gjennomsnittet av salget for den aktuelle måneden og foregående to måneder: Merk at de to første radene for tre måneders glidende gjennomsnittlig beregning i Utdataene er basert på en mindre intervallstørrelse enn spesifisert fordi vinduets beregning ikke kan nå forbi dataene hentet av spørringen. Du må vurdere de ulike vindustørrelsene som finnes ved grensene til resultatsettene. Med andre ord, må du kanskje endre spørringen for å inkludere akkurat det du vil ha. Sentrert aggregatfunksjon Beregning av vindusaggregatfunksjoner sentrert rundt den nåværende raden er rett frem. Dette eksemplet beregner for alle kunder et sentrert glidende gjennomsnitt av salg i en uke i slutten av desember 1999. Den finner et gjennomsnitt av salgsbeløpet for den ene dagen som går foran den nåværende raden, og en dag etter den nåværende raden inkludert den aktuelle raden også. Eksempel 21-9 Sentrert aggregat Start - og sluttrader for hvert produkt med sentrert gjennomsnittlig beregning i utdataene er basert på bare to dager, siden vinduberegningen ikke kan nå forbi dataene hentet av spørringen. Brukere må vurdere de forskjellige vindustørrelsene som finnes ved grensene til resultatsettene: Spørringen må kanskje justeres. Windowing Aggregate Funksjoner i Tilstedeværelsen av Duplikater Følgende eksempel illustrerer hvordan vinduesaggregatfunksjoner beregner verdier når det er duplikater, det vil si når flere rader returneres for en enkelt bestillingsverdi. Søket henter antallet som selges til flere kunder i et angitt tidsområde. (Selv om vi bruker en inlinevisning for å definere vårt grunndatasett, har det ingen spesiell betydning og kan ignoreres.) Spørringen definerer et bevegelig vindu som går fra datoen for den aktuelle rad til 10 dager tidligere. Merk at RANGE-nøkkelordet brukes til å definere vindusklausulen i dette eksemplet. Dette betyr at vinduet potensielt kan holde mange rader for hver verdi i området. I dette tilfellet er det tre par rader med dupliserte datoverdier. Eksempel 21-10 Veksle aggregatfunksjoner med logiske forskyvninger I utgangen av dette eksemplet returnerer alle datoer unntatt 6. mai og 12. mai to rader med dupliserte datoer. Undersøk de kommenterte tallene til høyre for utgangen for å se hvordan verdiene beregnes. Merk at hver gruppe i parentes representerer verdiene som returneres for en enkelt dag. Merk at dette eksemplet bare gjelder når du bruker RANGE-søkeordet i stedet for ROWS-søkeordet. Det er også viktig å huske det med RANGE. Du kan bare bruke 1 ORDER BY-uttrykk i den analytiske funksjonen ORDER BY-setningen. Med ROWS-søkeordet kan du bruke flere ordre med uttrykk i den analytiske funksjonen ORDER BY-setningen. Varying Window Size for hver rad Det er situasjoner der det er nyttig å variere størrelsen på et vindu for hver rad, basert på en spesifisert tilstand. For eksempel vil du kanskje gjøre vinduet større for bestemte datoer og mindre for andre. Anta at du vil beregne det bevegelige gjennomsnittet av aksjekursen over tre virkedager. Hvis du har like mange rader for hver dag for alle virkedager, og ingen arbeidsdager lagres, kan du bruke en fysisk vindufunksjon. Hvis betingelsene ikke er oppfylt, kan du likevel beregne et glidende gjennomsnitt ved å bruke et uttrykk i parameterparametrene for vindustørrelse. Uttrykk i en vinduesstørrelsespesifikasjon kan gjøres i flere forskjellige kilder. uttrykket kan være en referanse til en kolonne i et bord, for eksempel et tidtabell. Det kan også være en funksjon som returnerer den riktige grensen for vinduet basert på verdier i den nåværende raden. Følgende uttalelse for en hypotetisk aksjekursdatabase bruker en brukerdefinert funksjon i sin RANGE-klausul for å angi vinduets størrelse: I denne setningen er ttimekey et datafelt. Her kan fn være en PLSQL-funksjon med følgende spesifikasjon: 4 hvis ttimekey er mandag, tirsdag Hvis noen av de foregående dagene er helligdager, justerer det tellingen riktig. Vær oppmerksom på at når vinduet er spesifisert ved hjelp av et tall i en vindufunksjon med ORDER BY på en datakolonne, blir den konvertert til å bety antall dager. Du kunne også ha brukt intervallet bokstavelig konverteringsfunksjon, som NUMTODSINTERVAL (fn (ttimekey), DAY) i stedet for bare fn (ttimekey) for å bety det samme. Du kan også skrive en PLSQL-funksjon som returnerer en INTERVAL datatype verdi. Windowing Aggregate Funksjoner med Fysisk Offsets For vinduer uttrykt i rader, bør ordreuttrykkene være unike for å produsere deterministiske resultater. For eksempel er følgende spørring ikke deterministisk fordi timeid ikke er unikt i dette resultatsettet. Eksempel 21-11 Veksle aggregatfunksjoner med fysiske forskyvninger En måte å håndtere dette problemet på ville være å legge til prodidkolonnen til resultatsettet og rekkefølgen på både timeid og prodid. FIRSTVALUE og LASTVALUE Funksjoner Funksjonene FIRSTVALUE og LASTVALUE lar deg velge de første og siste radene fra et vindu. Disse radene er spesielt verdifulle fordi de ofte brukes som basislinjer i beregninger. For eksempel, med en partisjon med salgsdata som er bestilt etter dag, kan du spørre hvor mye var salget per dag i forhold til den første salgsdagen (FIRSTVALUE) i perioden. Eller kanskje du ønsker å vite, for et sett med rader i økende salgsordre , Hva var prosentstørrelsen på hvert salg i regionen i forhold til det største salget (LASTVALUE) i regionen Hvis alternativet IGNORE NULLS brukes med FIRSTVALUE. det vil returnere den første ikke-nullverdien i settet, eller NULL hvis alle verdier er NULL. Hvis IGNORE NULLS brukes med LASTVALUE. Den returnerer den siste ikke-nullverdien i settet, eller NULL hvis alle verdier er NULL. Alternativet IGNORE NULLS er spesielt nyttig når du fyller opp et beholdningsbord riktig. Rapportering av aggregerte funksjoner Etter at en forespørsel er behandlet, kan aggregerte verdier som antall resulterende rader eller en gjennomsnittsverdi i en kolonne enkelt beregnes i en partisjon og gjøres tilgjengelig for andre rapporteringsfunksjoner. Rapporteringsaggregatfunksjonene returnerer den samme aggregatverdien for hver rad i en partisjon. Deres oppførsel med hensyn til NULLs er den samme som SQL-aggregatfunksjonene. Syntaxen er: I tillegg gjelder følgende betingelser: En stjerne () er bare tillatt i COUNT () DISTINCT støttes bare hvis tilsvarende aggregatfunksjoner tillater det å verdsette uttrykk1 og verdien expression2 kan være et gyldig uttrykk som involverer kolonnreferanser eller aggregater. PARTITION BY-klausulen definerer de gruppene som vindueringsfunksjonene skal beregnes på. Hvis PARTITION BY-klausulen er fraværende, beregnes funksjonen over hele spørringsresultatet. Rapporteringsfunksjoner kan bare vises i SELECT-klausulen eller ORDER BY-klausulen. Den store fordelen med rapporteringsfunksjoner er deres evne til å gjøre flere passerer med data i en enkelt spørringsblokk og øke søkeprestasjonen. Spørsmål som å telle antall selgere med salg mer enn 10 av bysalg krever ikke tilkoblinger mellom separate spørringsblokker. For eksempel, vurder spørsmålet For hver produktkategori finner du regionen der den hadde maksimalt salg. Den ekvivalente SQL-spørringen ved hjelp av MAX-rapporteringsaggregatfunksjonen ville være: Det indre spørsmålet med rapporteringsaggregatfunksjonen MAX (SUM (amountsold)) returnerer: De fullstendige søkeresultatene er: Eksempel 21-12 Rapportering av aggregeringseksempel Rapporteringsaggregater kombinert med nestede spørringer aktiver Du skal svare på komplekse spørringer effektivt. For eksempel, hva hvis du vil vite de bestselgende produktene i de mest betydningsfulle produktkategorierna dine Følgende er en spørring som finner de 5 bestselgende produktene for hver produktkategori som bidrar til mer enn 20 av salget innenfor produktkategorien: RATIOTOREPORT Funksjon RATIOTOREPORT-funksjonen beregner forholdet mellom en verdi og summen av et sett med verdier. Hvis uttrykksvarsuttrykket evalueres til NULL. RATIOTOREPORT vurderer også til NULL. men det blir behandlet som null for å beregne summen av verdier for nevnen. Syntaxen er: I dette gjelder følgende: expr kan være et gyldig uttrykk som involverer kolonnreferanser eller aggregater. PARTITION BY-klausulen definerer de gruppene som RATIOTOREPORT-funksjonen skal beregnes på. Hvis PARTITION BY-klausulen er fraværende, beregnes funksjonen over hele spørringsresultatet. For å beregne RATIOTOREPORT av salget for hver kanal, kan du bruke følgende syntaks: LAGLEAD-funksjoner LAG - og LEAD-funksjonene er nyttige for å sammenligne verdier når relativ posisjoner av rader kan bli kjent pålitelig. De jobber med å spesifisere antall rader som skiller målraden fra den nåværende raden. Fordi funksjonene gir tilgang til mer enn én rad av et bord samtidig uten selvtillit, kan de forbedre behandlingshastigheten. LAG-funksjonen gir tilgang til en rad ved et gitt forskyvning før den nåværende posisjonen, og LEAD-funksjonen gir tilgang til en rad ved et gitt forskyvning etter gjeldende posisjon. LAGLEAD Syntax Disse funksjonene har følgende syntaks: Offset er en valgfri parameter og standard til 1. standard er en valgfri parameter og verdien returneres hvis offset faller utenfor grensene til tabellen eller partisjonen. Se Data Densification for Reporting for informasjon som viser hvordan du bruker LAG LEAD-funksjonene for å gjøre periodiske sammenligningsforespørsler på sparsomme data. FIRSTLAST-funksjoner FIRSTLAST-aggregatfunksjonene lar deg rangere et datasett og arbeide med topprangerte eller nedre rangerte rader. Etter å ha funnet de øverste eller nederste rangerte radene, brukes en aggregatfunksjon til hvilken som helst ønsket kolonne. Dvs. FØRSTE LAST lar deg rangere på kolonne A, men returnere resultatet av et aggregat som er brukt på de først rangert eller sist rangert radene i kolonne B. Dette er verdifullt fordi det unngår behovet for selvtillit eller underspørsmål, og dermed forbedre ytelsen. Disse funksjonene syntaks begynner med en vanlig aggregatfunksjon (MIN. MAX. SUM. AVG. COUNT. VARIANCE. STDDEV) som gir en enkelt returverdi per gruppe. For å spesifisere rangeringen som brukes, legger FIRST LAST-funksjonene til en ny klausul som starter med ordet KEEP. FIRSTLAST-syntaks Disse funksjonene har følgende syntaks: Merk at ORDER BY-klausulen kan ta flere uttrykk. FIRSTLAST Som regelmessige aggregater Du kan bruke FIRST LAST-familien av aggregater som vanlige aggregatfunksjoner. Eksempel 21-15 FIRSTLAST Eksempel 1 Følgende spørsmål lar oss sammenligne minimumspris og listepris på våre produkter. For hver produktkategori i kategorien Herreklær returnerer den følgende: Listepris på produktet med laveste laveste pris Laveste minimumspris Listepris på produktet med høyeste minimumspris Høyeste minimumspris FIRSTLAST Som rapporteringsaggregater Du kan også bruke FIRST LAST familie av aggregater som rapporterende aggregatfunksjoner. Et eksempel er å beregne hvilke måneder som hadde størst og minst økning i hodeantal i løpet av året. Syntaxen for disse funksjonene ligner på syntaksen for andre rapporteringsaggregater. Vurder eksemplet i eksempel 21-15 for FIRSTLAST. Hva om vi ønsket å finne listeprisene for de enkelte produktene og sammenligne dem med listeprisene for produktene i deres underkategori som hadde høyeste og laveste minimumsprisene Følgende spørsmål lar oss finne den informasjonen for dokumentasjonsunderkategorien ved å bruke FIRSTLAST som rapportering aggregater. Eksempel 21-16 FIRSTLAST Eksempel 2 Bruk av FIRST og LAST-funksjonene som rapporteringsaggregater gjør det enkelt å inkludere resultatene i beregninger slik Lønn som prosent av høyeste lønn. Inverse Percentile Funksjoner Med CUMEDIST-funksjonen kan du finne den kumulative fordeling (percentile) av et sett med verdier. Imidlertid er den omvendte operasjonen (å finne hvilken verdi som beregnes til en viss prosentil) ikke lett å gjøre eller effektivt beregnet. For å overvinne denne vanskeligheten ble PERCENTILECONT og PERCENTILEDISC-funksjonene introdusert. Disse kan brukes både som vindu rapporteringsfunksjoner samt normale aggregatfunksjoner. Disse funksjonene trenger en sorteringsspesifikasjon og en parameter som tar en prosentilverdi mellom 0 og 1. Sorterespesifikasjonen håndteres ved å bruke en ORDER BY-setning med ett uttrykk. Når den brukes som en normal aggregatfunksjon, returnerer den en enkelt verdi for hvert bestilt sett. PERCENTILECONT. som er en kontinuerlig funksjon beregnet av interpolering, og PERCENTILEDISC. som er en trinnfunksjon som tar for seg diskrete verdier. Som andre aggregater opererer PERCENTILECONT og PERCENTILEDISC på en gruppe rader i en gruppert søk, men med følgende forskjeller: De krever en parameter mellom 0 og 1 (inkluderende). En parameter angitt ut av dette området vil resultere i feil. Denne parameteren bør spesifiseres som et uttrykk som evaluerer til en konstant. De krever en sorteringsspesifikasjon. Denne sorteringsspesifikasjonen er en ORDER BY-setning med et enkelt uttrykk. Flere uttrykk er ikke tillatt. Normal Aggregate Syntax Inverse Percentile Eksempel Basis Vi bruker følgende spørring for å returnere de 17 radene dataene som brukes i eksemplene i denne delen: PERCENTILEDISC (x) beregnes ved å skanne opp CUMEDIST-verdiene i hver gruppe til du finner den første som er større enn eller lik x. hvor x er den angitte prosentilverdien. For eksempelforespørselen hvor PERCENTILEDISC (0.5) er resultatet 5000, som følgende illustrerer: Resultatet av PERCENTILECONT beregnes ved lineær interpolering mellom rader etter bestilling. For å beregne PERCENTILECONT (x). vi beregner først radnummeret RN (1x (n-1)), hvor n er antall rader i gruppen og x er den angitte prosentilverdien. Det endelige resultatet av aggregatfunksjonen beregnes ved lineær interpolering mellom verdiene fra rader ved radnummer CRN CEIL (RN) og FRN FLOOR (RN). Det endelige resultatet vil være: PERCENTILECONT (X) if (CRN FRN RN), deretter (verdien av uttrykket fra rad ved RN) ellers (CRN - RN) (verdien av uttrykket for rad ved FRN) (RN - FRN) uttrykk for rad ved CRN). Vurder det forrige eksempelet spørringen, der vi beregner PERCENTILECONT (0.5). Her er n 17. Radnummeret RN (1 0,5 (n-1)) 9 for begge gruppene. Ved å sette dette inn i formelen, (FRNCRN9), returnerer vi verdien fra rad 9 som resultat. Et annet eksempel er, hvis du vil beregne PERCENTILECONT (0.66). Beregnet radnummer RN (1 0,66 (n -1)) (1 0,6616) 11,67. PERCENTILECONT (0.66) (12-11.67) (verdi av rad 11) (11.67-11) (verdi av rad 12). Disse resultatene er: Inverse percentileaggregatfunksjoner kan vises i HAVING-klausulen av en spørring som andre eksisterende aggregatfunksjoner. Som rapporteringsaggregater Du kan også bruke aggregatfunksjonene PERCENTILECONT. PERCENTILEDISC som rapporteringsaggregatfunksjoner. Når det brukes som rapporteringsaggregatfunksjoner, er syntaksen likt som for andre rapporteringsaggregater. Denne spørringen beregner det samme (median kredittgrense for kunder i dette resultatsettet, men rapporterer resultatet for hver rad i resultatsettet, som vist i følgende utgang: Omvendt prosentvis restriksjoner for PERCENTILEDISC. Uttrykket i ORDER BY-klausulen kan Vær av hvilken som helst datatype som du kan sortere (numerisk, streng, dato osv.). Men uttrykket i ORDER BY-klausulen må være en numerisk eller datetime-type (inkludert intervaller) fordi lineær interpolering brukes til å evaluere PERCENTILECONT. Hvis uttrykket er av type DATE, blir det interpolerte resultatet avrundet til den minste enheten for typen. For en DATE-type vil den interpolerte verdien avrundes til nærmeste sekund, for intervalltyper til nærmeste sekund (INTERVAL DAG TIL ANDRE) eller til måneden (INTERVAL ÅR TIL MÅNED). I likhet med andre aggregater ignorerer de inverse prosentilfunksjonene NULLs ved evaluering av resultatet. For eksempel, når du vil finne medianverdien i et sett, ignorerer Oracle Database NUL Ls og finner medianen blant de ikke-null-verdiene. Du kan bruke NULLS FIRST NULLS LAST-alternativet i ORDER BY-klausulen, men de vil bli ignorert ettersom NULL er ignorert. Hypotetiske rang - og distribusjonsfunksjoner Disse funksjonene gir funksjonalitet nyttig for hva-hvis-analyse. Som et eksempel, hva ville være raden på en rad, hvis raden ble hypotetisk satt inn i et sett med andre rader Denne familien av aggregater tar en eller flere argumenter av en hypotetisk rad og en bestilt gruppe rader, og returnerer RANKEN. DENSERANK. PERCENTRANK eller CUMEDIST av raden som om den ble hypotetisk satt inn i gruppen. Hypotetisk rangering og distribusjonssyntaks Her refererer konstant uttrykk til et uttrykk som evaluerer til en konstant, og det kan være mer enn ett slikt uttrykk som overføres som argumenter til funksjonen. ORDER BY-klausulen kan inneholde ett eller flere uttrykk som definerer sorteringsrekkefølgen som rangeringen skal baseres på. ASC. DESC. NULLS FØRSTE. NULLS LAST-valgene vil være tilgjengelige for hvert uttrykk i ORDER BY. Eksempel 21-17 Hypotetisk rangering og distribusjon Eksempel 1 Ved å bruke listeprisdata fra produkttabellen som brukes i denne delen, kan du beregne RANK. PERCENTRANK og CUMEDIST for en hypotetisk genser med en pris på 50 for hvordan den passer i hver av underkategorierne til genseren. Spørringen og resultatene er: I motsetning til de inverse prosentilaggregatene, kan ORDER BY-klausulen i sortespesifikasjonen for hypotetiske rang - og distribusjonsfunksjoner ta flere uttrykk. Antallet argumenter og uttrykkene i ORDER BY-klausulen skal være det samme, og argumentene må være konstantuttrykk av samme eller kompatible type til det tilsvarende ORDER BY-uttrykket. Følgende er et eksempel ved å bruke to argumenter i flere hypotetiske rangeringsfunksjoner. Eksempel 21-18 Hypotetisk rangering og distribusjon Eksempel 2 Disse funksjonene kan vises i HAVING-klausulen av en spørring, akkurat som andre aggregatfunksjoner. De kan ikke brukes som enten rapportering av aggregatfunksjoner eller vinduesaggregatfunksjoner. Linjære regresjonsfunksjoner Regresjonsfunksjonene støtter montering av en ordinær minste kvadratregressjonslinje til et sett med tallpar. Du kan bruke dem som både aggregatfunksjoner eller vinduer eller rapporteringsfunksjoner. Funksjonene er som følger: Oracle bruker funksjonen til settet av (e1. E2) par etter eliminering av alle parene for hvilke ei eller e2 er null. e1 tolkes som en verdi av den avhengige variabelen (a y-verdi), og e2 tolkes som en verdi av den uavhengige variabelen (en x-verdi). Begge uttrykkene må være tall. Regresjonsfunksjonene blir alle beregnet samtidig under ett enkelt pass gjennom dataene. De blir ofte kombinert med COVARPOP. COVARSAMP. og CORR funksjoner. REGRCOUNT Funksjon REGRCOUNT returnerer antall ikke-null nummerpar som brukes til å passe til regresjonslinjen. Hvis det brukes et tomt sett (eller hvis det ikke er noen (e1, e2) par hvor ingen av e1 eller e2 er null), returnerer funksjonen 0. REGRAVGY og REGRAVGX Funksjoner REGRAVGY og REGRAVGX beregner gjennomsnittet av den avhengige variabelen og den uavhengige variabel av regresjonslinjen, henholdsvis. REGRAVGY beregner gjennomsnittet av det første argumentet (e1) etter eliminering av (e1. E2) par hvor enten e1 eller e2 er null. På samme måte beregner REGRAVGX gjennomsnittet av dets andre argument (e2) etter null eliminering. Begge funksjonene returnerer NULL hvis det brukes på et tomt sett. REGRSLOPE og REGRINTERCEPT Funksjoner REGRSLOPE-funksjonen beregner hellingen til regresjonslinjen montert på ikke-null (e1. E2) par. REGRINTERCEPT-funksjonen beregner y-avspenningen av regresjonslinjen. REGRINTERCEPT returnerer NULL når helling eller regresjonsmidlene er NULL. REGRR2 Funksjon REGRR2-funksjonen beregner bestemmelseskoeffisienten (vanligvis kalt R-kvadrat eller godhet av passform) for regresjonslinjen. REGRR2 returnerer verdier mellom 0 og 1 når regresjonslinjen er definert (helling av linjen er ikke null), og den returnerer NULL ellers. Jo nærmere verdien er til 1, desto bedre passer regresjonslinjen til dataene. REGRSXX, REGRSYY, og REGRSXY Funksjoner REGRSXX. REGRSYY og REGRSXY-funksjoner brukes til å beregne ulike diagnostiske statistikker for regresjonsanalyse. Etter eliminering av (e1, e2) par hvor en av e1 eller e2 er null, gjør disse funksjonene følgende beregninger: Eksempler på lineær regresjonsstatistikk Noen vanlige diagnostiske statistikker som følger med lineær regresjonsanalyse er gitt i tabell 21-2, vanlig diagnostisk statistikk og deres Uttrykkene . Vær oppmerksom på at denne utgivelsen av nye funksjoner lar deg beregne alle disse. Tabell 21-2 Felles diagnostisk statistikk og deres uttrykk Eksempel linjær regresjonsberegning I dette eksemplet beregner vi en regresjonslinje med ordinært minste kvadrat som uttrykker mengden som er solgt av et produkt som en lineær funksjon av produktlisten. Beregningene er gruppert etter salgskanal. Verdiene SLOPE. INTCPT. RSQR er henholdsvis helling, avskjæring og bestemmelseskoeffisient av regresjonslinjen. Verdien (heltall) COUNT er antall produkter i hver kanal for hvem både solgt kvantum og listeprisdata er tilgjengelige. Hyppige elementer i stedet for å telle hvor ofte en bestemt hendelse forekommer (for eksempel hvor ofte noen har kjøpt melk i dagligvarebutikken), gir hyppige elementer en mekanisme for å telle hvor ofte flere hendelser oppstår sammen (for eksempel hvor ofte noen har kjøpt både melk og frokostblanding sammen i matbutikken). Inngangen til funksjonen Frequent-Itemsets er et sett med data som representerer samlinger av elementer (elementene). Noen eksempler på elementer kan være alle produktene som en gitt kunde kjøpte i en enkelt tur til matbutikken (vanligvis kalt en markedskurv), nettsidene som en bruker åpnet i en enkelt økt, eller de finansielle tjenestene som en gitt kunden bruker. Begrepet av en vanlig itemet er å finne de elementene som forekommer oftest. Hvis du bruker den hyppige oppføringsoperatøren til en dagligvarebutikk, kan du for eksempel oppdage at melk og bananer er det mest kjøpte paret av varer. Hyppige elementer er dermed blitt brukt i forretningsmessig intelligens miljøer i mange år, med den mest vanlige å være for markedskurv analyse i detaljhandel. Hyppige elementer er integrert med databasen, opererer på toppen av relasjonelle tabeller og åpnes via SQL. Denne integrasjonen gir et par viktige fordeler: Programmer som tidligere var avhengige av hyppige itemset-operasjoner, har nå dra nytte av betydelig forbedret ytelse og enklere implementering. SQL-baserte applikasjoner som ikke tidligere brukte vanlige elementer, kan nå enkelt utvides for å utnytte denne funksjonaliteten. Hyppig elementets analyse utføres med PLSQL-pakken DBMSFREQUENTITEMSETS. Se PLSQL-pakker og typer referanse for mer informasjon. Andre statistiske funksjoner Oracle introduserer et sett med SQL statistiske funksjoner og en statistikkpakke, DBMSSTATFUNCS. Denne delen viser noen av de nye funksjonene sammen med grunnleggende syntaks. Se PLSQL-pakker og - typer Referanse for detaljert informasjon om DBMSSTATFUNCS-pakken og Oracle Database SQL Reference for syntaks og semantikk. Beskrivende statistikk Du kan beregne følgende beskrivende statistikk: Median av en datasettmodus for et datasett Du kan beregne følgende parametriske statistikk: Spearmans rho-koeffisient Kendalls tau-b Koeffisient I tillegg til funksjonene har denne utgivelsen en ny PLSQL-pakke, DBMSSTATFUNCS. Den inneholder den beskrivende statistiske funksjonen SAMMENDRAG sammen med funksjoner for å støtte distribusjonsmontering. Sammendragsfunksjonen oppsummerer en numerisk kolonne av et bord med en rekke beskrivende statistikker. De fem distribusjonsfunksjonene støtter normal, uniform, Weibull, Poisson og eksponentielle distribusjoner. WIDTHBUCKET-funksjon For et gitt uttrykk returnerer WIDTHBUCKET-funksjonen bøtte nummeret som resultatet av dette uttrykket vil bli tildelt etter at det er evaluert. Du kan generere equividth histogrammer med denne funksjonen. Equiwidthistogrammer deler datasett i bukser hvis intervallstørrelse (høyeste verdi til laveste verdi) er lik. Antall rader som holdes av hver bøtte, vil variere. En relatert funksjon, NTILE. skaper equiheight skuffer. Equiwidthistogrammer kan bare genereres for numeriske, dato - eller datetime-typer. Så de tre første parameterne skal være alle numeriske uttrykk eller alle datouttrykk. Andre typer uttrykk er ikke tillatt. Hvis den første parameteren er NULL. Resultatet er NULL. Hvis den andre eller den tredje parameteren er NULL. En feilmelding returneres, da en NULL-verdi ikke kan angi et sluttpunkt (eller et hvilket som helst punkt) for et område i en dato eller numerisk verdi-dimensjon. Den siste parameteren (antall bøtter) skal være et numerisk uttrykk som vurderer til et positivt heltall 0, NULL. eller en negativ verdi vil resultere i en feil. Skuffer er nummerert fra 0 til (n 1). Bucket 0 holder verdien av verdier mindre enn minimumet. Bucket (n 1) inneholder antall verdier som er større enn eller lik den maksimalt angitte verdien. WIDTHBUCKET Syntax WIDTHBUCKET tar fire uttrykk som parametere. Den første parameteren er uttrykket som ekvividthistogrammet er for. Den andre og tredje parameteren er uttrykk som angir sluttpunktene for det akseptable området for den første parameteren. Den fjerde parameteren angir antall bøtter. Vurder følgende data fra bordkunder. som viser kredittgrensene for 17 kunder. Disse dataene er samlet i spørringen vist i eksempel 21-19. I bordet kunder. kolonnen custcreditlimit inneholder verdier mellom 1500 og 15000, og vi kan tildele verdiene til fire equiwidth buckets, nummerert fra 1 til 4, ved å bruke WIDTHBUCKET (custcreditlimit, 0, 20000, 4). Ideelt sett er hver bøtte et lukket åpent intervall av den reelle talelinjen, for eksempel er bøtte nummer 2 tildelt score mellom 5000.0000 og 9999.9999. noen ganger betegnet 5000, 10000) for å indikere at 5000 er inkludert i intervallet og 10 000 er utelukket. For å imøtekomme verdier utenfor rekkevidde 0, 20.000), er verdier mindre enn 0 tilordnet en bestemt understrømsbøtte som er nummerert 0, og verdier som er større enn eller lik 20.000, er tilordnet en utpekt overløpsbøtte som er nummerert 5 (num spann 1 generelt). Se figur 21-3 for en grafisk illustrasjon av hvordan skuffene er tildelt. Du kan angi grensene i omvendt rekkefølge, for eksempel WIDTHBUCKET (custcreditlimit. 20000. 0. 4). Når grensene er omvendt, vil buckene være åpne lukket. I dette eksemplet er bøtte nummer 1 (15000,20000, bøtte nummer 2 er (10000,15000, og bøtte nummer 4, er (0, 5000. Overløp bøtte nummereres 0 (20000. uendelig) vil bli nummerert 5 (- uendelig .0. Det er en feil hvis bøndeltallparameteren er 0 eller negativ. Følgende søk viser bøndenumrene for kredittgrensene i kundetabellen for begge tilfellene der grensene er spesifisert i vanlig eller omvendt rekkefølge. Vi bruker et område på 0 til 20 000. Brukerdefinerte aggregatfunksjoner Oracle tilbyr et anlegg for å lage dine egne funksjoner, kalt brukerdefinerte aggregatfunksjoner. Disse funksjonene er skrevet i programmeringsspråk som PLSQL, Java og C , og kan brukes som analytiske funksjoner eller aggregater i materialiserte visninger. Se Oracle Data Cartridge Developers Guide for ytterligere informasjon om syntaks og begrensninger. Fordelene ved disse funksjonene er: Meget komplekse funksjoner kan programmeres ved hjelp av en fullstendig prosedyre ural språk. Høyere skalerbarhet enn andre teknikker når brukerdefinerte funksjoner er programmert for parallellbehandling. Objektdatatyper kan behandles. Som et enkelt eksempel på en brukerdefinert aggregatfunksjon, bør du vurdere skråstatistikken. Denne beregningen måler hvis et datasett har en skrå fordeling om dens gjennomsnitt. Det vil fortelle deg om en hale av fordelingen er betydelig større enn den andre. Hvis du opprettet et brukerdefinert aggregat som kalles utskew og brukt det til kredittgrenseverdiene i forrige eksempel, kan SQL-setningen og resultatene se slik ut: Før du bygger brukerdefinerte aggregatfunksjoner, bør du vurdere om dine behov kan oppfylles i vanlig SQL. Mange komplekse beregninger er mulige direkte i SQL, spesielt ved å bruke CASE-uttrykket. Staying with regular SQL will enable simpler development, and many query operations are already well-parallelized in SQL. Even the earlier example, the skew statistic, can be created using standard, albeit lengthy, SQL. CASE Expressions Oracle now supports simple and searched CASE statements. CASE statements are similar in purpose to the DECODE statement, but they offer more flexibility and logical power. They are also easier to read than traditional DECODE statements, and offer better performance as well. They are commonly used when breaking categories into buckets like age (for example, 20-29, 30-39, and so on). The syntax for simple statements is: The syntax for searched statements is: You can specify only 255 arguments and each WHEN. THEN pair counts as two arguments. For a workaround to this limit, see Oracle Database SQL Reference . Suppose you wanted to find the average salary of all employees in the company. If an employees salary is less than 2000, you want the query to use 2000 instead. Without a CASE statement, you would have to write this query as follows, In this, foo is a function that returns its input if the input is greater than 2000, and returns 2000 otherwise. The query has performance implications because it needs to invoke a function for each row. Writing custom functions can also add to the development load. Using CASE expressions in the database without PLSQL, this query can be rewritten as: Using a CASE expression lets you avoid developing custom functions and can also perform faster. Creating Histograms With User-Defined Buckets You can use the CASE statement when you want to obtain histograms with user-defined buckets (both in number of buckets and width of each bucket). The following are two examples of histograms created with CASE statements. In the first example, the histogram totals are shown in multiple columns and a single row is returned. In the second example, the histogram is shown with a label column and a single column for totals, and multiple rows are returned. Example 21-21 Histogram Example 1 Example 21-22 Histogram Example 2 Data Densification for Reporting Data is normally stored in sparse form. That is, if no value exists for a given combination of dimension values, no row exists in the fact table. However, you may want to view the data in dense form, with rows for all combination of dimension values displayed even when no fact data exist for them. For example, if a product did not sell during a particular time period, you may still want to see the product for that time period with zero sales value next to it. Moreover, time series calculations can be performed most easily when data is dense along the time dimension. This is because dense data will fill a consistent number of rows for each period, which in turn makes it simple to use the analytic windowing functions with physical offsets. Data densification is the process of converting spare data into dense form. To overcome the problem of sparsity, you can use a partitioned outer join to fill the gaps in a time series or any other dimension. Such a join extends the conventional outer join syntax by applying the outer join to each logical partition defined in a query. Oracle logically partitions the rows in your query based on the expression you specify in the PARTITION BY clause. The result of a partitioned outer join is a UNION of the outer joins of each of the partitions in the logically partitioned table with the table on the other side of the join. Note that you can use this type of join to fill the gaps in any dimension, not just the time dimension. Most of the examples here focus on the time dimension because it is the dimension most frequently used as a basis for comparisons. Partition Join Syntax The syntax for partitioned outer join extends the ANSI SQL JOIN clause with the phrase PARTITION BY followed by an expression list. The expressions in the list specify the group to which the outer join is applied. The following are the two forms of syntax normally used for partitioned outer join: Note that FULL OUTER JOIN is not supported with a partitioned outer join. Sample of Sparse Data A typi cal situation with a sparse dimension is shown in the following example, which computes the weekly sales and year-to-date sales for the product Bounce for weeks 20-30 in 2000 and 2001: In this example, we would expect 22 rows of data (11 weeks each from 2 years) if the data were dense. However we get only 18 rows because weeks 25 and 26 are missing in 2000, and weeks 26 and 28 in 2001. Filling Gaps in Data We can take the sparse data of the preceding query and do a partitioned outer join with a dense set of time data. In the following query, we alias our original query as v and we select data from the times table, which we alias as t. Here we retrieve 22 rows because there are no gaps in the series. The four added rows each have 0 as their Sales value set to 0 by using the NVL function. Note that in this query, a WHERE condition was placed for weeks between 20 and 30 in the inline view for the time dimension. This was introduced to keep the result set small. Filling Gaps in Two Dimensions N-dimensional data is typically displayed as a dense 2-dimensional cross tab of (n - 2) page dimensions. This requires that all dimension values for the two dimensions appearing in the cross tab be filled in. The following is another example where the partitioned outer join capability can be used for filling the gaps on two dimensions: In this query, the WITH sub-query factoring clause v1. summarizes sales data at the product, country, and year level. This result is sparse but users may want to see all the country, year combinations for each product. To achieve this, we take each partition of v1 based on product values and outer join it on the country dimension first. This will give us all values of country for each product. We then take that result and partition it on product and country values and then outer join it on time dimension. This will give us all time values for each product and country combination. Filling Gaps in an Inventory Table An inventory table typically tracks quantity of units available for various products. This table is sparse: it only stores a row for a product when there is an event. For a sales table, the event is a sale, and for the inventory table, the event is a change in quantity available for a product. For example, consider the following inventory table: The inventory table now has the following rows: For reporting purposes, users may want to see this inventory data differently. For example, they may want to see all values of time for each product. This can be accomplished using partitioned outer join. In addition, for the newly inserted rows of missing time periods, users may want to see the values for quantity of units column to be carried over from the most recent existing time period. The latter can be accomplished using analytic window function LASTVALUE value. Here is the query and the desired output: The inner query computes a partitioned outer join on time within each product. The inner query densifies the data on the time dimension (meaning the time dimension will now have a row for each day of the week). However, the measure column quantity will have nulls for the newly added rows (see the output in the column quantity in the following results. The outer query uses the analytic function LASTVALUE. Applying this function partitions the data by product and orders the data on the time dimension column ( timeid ). For each row, the function finds the last non-null value in the window due to the option IGNORE NULLS. which you can use with both LASTVALUE and FIRSTVALUE. We see the desired output in the column repeatedquantity in the following output: Computing Data Values to Fill Gaps Examples in previous section illustrate how to use partitioned outer join to fill gaps in one or more dimensions. However, the result sets produced by partitioned outer join have null values for columns that are not included in the PARTITION BY list. Typically, these are measure columns. Users can make use of analytic SQL functions to replace those null values with a non-null value. For example, the following q uery computes monthly totals for products 64MB Memory card and DVD-R Discs (product IDs 122 and 136) for the year 2000. It uses partitioned outer join to densify data for all months. For the missing months, it then uses the analytic SQL function AVG to compute the sales and units to be the average of the months when the product was sold. If working in SQLPlus, the following two commands will wrap the column headings for greater readability of results: Time Series Calculations on Densified Data Densificatio n is not just for reporting purpose. It also enables certain types of calculations, especially, time series calculations. Time series calculations are easier when data is dense along the time dimension. Dense data has a consistent number of rows for each time periods which in turn make it simple to use analytic window functions with physical offsets. To illustrate, lets first take the example on Filling Gaps in Data. and lets add an analytic function to that query. In the following enhanced version, we calculate weekly year-to-date sales alongside the weekly sales. The NULL values that the partitioned outer join inserts in making the time series dense are handled in the usual way: the SUM function treats them as 0s. Period-to-Period Comparison for One Time Level: Example How do we use this feature to compare values across time periods Specifically, how do we calculate a year-over-year sales comparison at the week level The following query returns on the same row, for each product, the year-to-date sales for each week of 2001 with that of 2000. Note that in this example we start with a WITH clause. This improves readability of the query and lets us focus on the partitioned outer join. If working in SQLPlus, the following command will wrap the column headings for greater readability of results: In the FROM clause of the in-line view densesales. we use a partitioned outer join of aggregate view v and time view t to fill gaps in the sales data along the time dimension. The output of the partitioned outer join is then processed by the analytic function SUM. OVER to compute the weekly year-to-date sales (the weeklyytdsales column). Thus, the view densesales computes the year-to-date sales data for each week, including those missing in the aggregate view s. The in-line view yearoveryearsales then computes the year ago weekly year-to-date sales using the LAG function. The LAG function labeled weeklyytdsalesprioryear specifies a PARTITION BY clause that pairs rows for the same week of years 2000 and 2001 into a single partition. We then pass an offset of 1 to the LAG function to get the weekly year to date sales for the prior year. The outermost query block selects data from yearoveryearsales with the condition yr 2001, and thus the query returns, for each product, its weekly year-to-date sales in the specified weeks of years 2001 and 2000. Period-to-Period Comparison for Multiple Time Levels: Example While the prior example shows us a way to create comparisons for a single time level, it would be even more useful to handle multiple time levels in a single query. For example, we could compare sales versus the prior period at the year, quarter, month and day levels. How can we create a query which performs a year-over-year comparison of year-to-date sales for all levels of our time hierarchy We will take several steps to perform this task. The goal is a single query with comparisons at the day, week, month, quarter, and year level. The steps are as follows: We will create a view called cubeprodtime. which holds a hierarchical cube of sales aggregated across times and products . Then we will create a view of the time dimension to use as an edge of the cube. The time edge, which holds a complete set of dates, will be partitioned outer joined to the sparse data in the view cubeprodtime . Finally, for maximum performance, we will create a materialized view, mvprodtime. built using the same definition as cubeprodtime . For more information regarding hierarchical cubes, see Chapter 20, SQL for Aggregation in Data Warehouses. The materialized view is defined using the following statement: Step 1 Create the hierarchical cube view The materialized view shown in the following may already exist in your system if not, create it now. If you must generate it, please note that we limit the query to just two products to keep processing time short: Because this view is limited to two products, it returns just over 2200 rows. Note that the column HierarchicalTime contains string representations of time from all levels of the time hierarchy. The CASE expression used for the HierarchicalTime column appends a marker (0, 1. ) to each date string to denote the time level of the value. A 0 represents the year level, 1 is quarters, 2 is months, and 3 is day. Note that the GROUP BY clause is a concatenated ROLLUP which specifies the rollup hierarchy for the time and product dimensions. The GROUP BY clause is what determines the hierarchical cube contents. Step 2 Create the view edgetime, which is a complete set of date values edgetime is the source for filling time gaps in the hierarchical cube using a partitioned outer join. The column HierarchicalTime in edgetime will be used in a partitioned join with the HierarchicalTime column in the view cubeprodtime. The following statement defines edgetime : Step 3 Create the materialized view mvprodtime to support faster performance The materialized view definition is a duplicate of the view cubeprodtime defined earlier. Because it is a duplicate query, references to cubeprodtime will be rewritten to use the mvprodtime materialized view. The following materialized may already exist in your system if not, create it now. If you must generate it, please note that we limit the query to just two products to keep processing time short. Step 4 Create the comparison query We have now set the stage for our comparison query. We can obtain period-to-period comparison calculations at all time levels. It requires applying analytic functions to a hierarchical cube with dense data along the time dimension. Some of the calculations we can achieve for each time level are: Sum of sales for prior period at all levels of time. Variance in sales over prior period. Sum of sales in the same period a year ago at all levels of time. Variance in sales over the same period last year. The following example performs all four of these calculations. It uses a partitioned outer join of the views cubeprodtime and edgetime to create an in-line view of dense data called densecubeprodtime. The query then uses the LAG function in the same way as the prior single-level example. The outer WHERE clause specifies time at three levels: the days of August 2001, the entire month, and the entire third quarter of 2001. Note that the last two rows of the results contain the month level and quarter level aggregations. Note: To make the results easier to read if you are using SQLPlus, the column headings should be adjusted with the following commands. The commands will fold the column headings to reduce line length: Here is the query comparing current sales to prior and year ago sales: The first LAG function ( salespriorperiod ) partitions the data on gidp. cat. subcat. prod. gidt and orders the rows on all the time dimension columns. It gets the sales value of the prior period by passing an offset of 1. The second LAG function ( salessameperiodprioryear ) partitions the data on additional columns qtrnum. monnum. and daynum and orders it on yr so that, with an offset of 1, it can compute the year ago sales for the same period. The outermost SELECT clause computes the variances. Creating a Custom Member in a Dimension: Example In many OLAP tasks, it is helpful to define custom members in a dimension. For instance, you might define a specialized time period for analyses. You can use a partitioned outer join to temporarily add a member to a dimension. Note that the new SQL MODEL clause is suitable for creating more complex scenarios involving new members in dimensions. See Chapter 22, SQL for Modeling for more information on this topic. As an example of a task, what if we want to define a new member for our time dimension We want to create a 13th member of the Month level in our time dimension. This 13th month is defined as the summation of the sales for each product in the first month of each quarter of year 2001. The solution has two steps. Note that we will build this solution using the views and tables created in the prior example. Two steps are required. First, create a view with the new member added to the appropriate dimension. The view uses a UNION ALL operation to add the new member. To query using the custom member, use a CASE expression and a partitioned outer join. Our new member for the time dimension is created with the following view: In this statement, the view timec is defined by performing a UNION ALL of the edgetime view (defined in the prior example) and the user-defined 13th month. The gidt value of 8 was chosen to differentiate the custom member from the standard members. The UNION ALL specifies the attributes for a 13th month member by doing a SELECT from the DUAL table. Note that the grouping id, column gidt. is set to 8, and the quarter number is set to 5. Then, the second step is to use an inline view of the query to perform a partitioned outer join of cubeprodtime with timec. This step creates sales data for the 13th month at each level of product aggregation. In the main query, the analytic function SUM is used with a CASE expression to compute the 13th month, which is defined as the summation of the first months sales of each quarter. The SUM function uses a CASE to limit the data to months 1, 4, 7, and 10 within each year. Due to the tiny data set, with just 2 products, the rollup values of the results are necessarily repetitions of lower level aggregations. For more realistic set of rollup values, you can include more products from the Game Console and Y Box Games subcategories in the underlying materialized view. Exponential moving average in T-SQL Exponential moving averages are similar to weighted moving averages in that they assign less weight to changes long ago, and more weight to recent changes. Weighted moving averages are linear, but exponential moving averages are exponential. That is, the weight can be expressed as a curve: There is a great way to calculate exponential moving averages in T-SQL using an undocumented feature about variables and running totals in SQL Server. In this blog post I will show how to use that method to calculate exponential moving average in T-SQL, but I will also present a method that is using standard features in SQL Server. Unfortunately, that means using a loop. In the examples I will calculate a 9 days exponential moving average. The examples use the database TAdb. A script to create TAdb can be found here . Exponential Moving Average (EMA): Running Totals Method The theory behind the running total features in updates is described in detail by Jeff Moden in his article Solving the Running Total and Ordinal Rank Problems. Other resources that describe using this method to calculate EMA are the blog post Calculating Moving Averages with T-SQL by Gabriel Priester and the forum post Exponential Moving Average Challenge. both on SQL Server Central. Basically, in T-SQL you can update variables as well as columns in an update statement. The updates are done row by row internally by SQL Server. This row by row behavior is what makes calculating a running total possible. This example shows how it works: Note that 8220ColumnRunningTotal8221 is a running total of 8220ColumnToSum8221. Using this method we can calculate EMA9 with this T-SQL: The calculation of EMA is rather simple. We use the current row and the previous, but with more weight to the current row. The weight is calculated by the formula 2(19), where 822098221 is the parameter for the length of the EMA. To calculate EMA9 for row 10 above, the calculation is: In this case the current row gets 20 of the weight (2(19)0.2) and the previous row gets 80 of the weight (1-2(19)0.8). You find this calculation in the statement above in the CASE statement: Exponential Moving Average (EMA): Looping Method As far as I know, except for the running totals method outlined above, there is no way to calculate EMA using a set based SQL statement. Therefore, the T-SQL below is using a while loop to calculate EMA9: The results are the same as in the running totals example above. Performance As expected, the set based running totals version is way faster than the loop version. On my machine the set based solution was about 300 ms, compared to about 1200 with the loop version. The loop version is more conforming to SQL standards however. So the choice between the methods depends on what8217s most important for you, performance or standards. The exponential moving average can be used in trend analysis, as with the other types of moving averages, Simple Moving Average (SMA) and Weighted moving average (WMA) . There are also other calculations in technical analysis that uses the EMA, MACD for instance. This blog post is part of a serie about technical analysis, TA, in SQL Server. See the other posts here . Posted by Tomas Lind Tomas Lind - Consulting services as SQL Server DBA and Database Developer at High Coast Database Solutions AB .

No comments:

Post a Comment