Analytiske funksjonskonsepter i Standard SQL
en analytisk funksjon beregner verdier over en gruppe rader og returnerer asingle resultat for hver rad. Dette er forskjellig fra en mengdefunksjon,som returnerer et enkelt resultat for en gruppe rader.
en analytisk funksjon inkluderer en OVER
– klausul, som definerer et vindu av raderrundt raden som evalueres. For hver rad, analysefunksjonen resultterberegnes ved hjelp av det valgte vinduet rader som input, possiblydoing aggregering.
med analytiske funksjoner kan du beregne glidende gjennomsnitt, rangere elementer, kalkulere kumulative summer og utføre andre analyser.
følgende funksjoner kan brukes som analytiske funksjoner:navigasjonsfunksjoner,nummereringsfunksjoner og aggregerte analytiske funksjoner
analytisk funksjonssyntaks
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Notasjonsregler
- Hakeparenteser «» indikerer valgfrie klausuler.
- Parenteser «() » angir bokstavelige parenteser.
- den vertikale linjen » / » indikerer en logisk ELLER.
- Curly braces «{ } » vedlegger et sett med alternativer.
- et komma etterfulgt av en ellipse i firkantede parenteser «» indikerer at det foregående elementet kan gjentas i en kommaseparert liste.
Beskrivelse
en analytisk funksjon beregner resultater over en gruppe rader. Du kan bruke thefollowing syntaks til å bygge en analytisk funksjon:
-
analytic_function_name
: funksjonen som utfører en analytisk operasjon.For eksempel kan nummereringsfunksjonenRANK()
brukes her. -
argument_list
: Argumenter som er spesifikke for den analytiske funksjonen.Noen funksjoner har dem, noen gjør det ikke. -
OVER
: Nøkkelord som kreves i den analytiske funksjonen syntaks precedingOVER
klausul. -
over_clause
: Refererer til et vindu som definerer en groupof rader i en tabell hvorpå å bruke en analytisk funksjon. -
window_specification
: Definerer spesifikasjonene forvinduet. -
window_frame_clause
: Definerer vindusrammenfor vinduet. -
rows_range
: Definerer de fysiske radene eller det alogiske området for en vindusramme.
Merknader
en analytisk funksjon kan vises som en skalar uttrykk operand into steder i spørringen:
-
SELECT
listen. Hvis den analytiske funksjonen vises iSELECT
– listen, kan ikke argumentlisten ogOVER
– setningsdelen referere til aliaser introdusert i DEN SAMME SELECT-listen. -
ORDER BY
– klausulen. Hvis den analytiske funksjonen vises iORDER BY
– klausulen i spørringen, kan argumentlisten referere tilSELECT
listaliaser.
en analytisk funksjon kan ikke referere til en annen analytisk funksjon i sinargumentliste eller dens OVER
– klausul, selv indirekte gjennom et alias.
en analytisk funksjon evalueres etter aggregering. For eksempel evalueresGROUP BY
-setningsdelen og ikke-analytiske mengdefunksjoner først.Fordi aggregatfunksjoner evalueres før analytiske funksjoner, kan aggregatfunksjoner brukes som inndataoperander til analytiske funksjoner.
Returnerer
et enkelt resultat for hver rad i inngangen.
Definere over-setningsdelen
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Beskrivelse
OVER
setningsdelen refererer til et vindu som definerer en gruppe rader i en tabell som skal bruke en analytisk funksjon. Du kan gi en named_window
som er definert i spørringen din, eller du kandefinere spesifikasjonene for et nytt vindu.
Merknader
hvis verken et navngitt vindu eller vindu spesifikasjon er gitt, allinput rader er inkludert i vinduet for hver rad.
Eksempler som brukerOVER
klausulen
disse spørringene bruker vindusspesifikasjoner:
- Beregne en totalsum
- Beregne en delsum
- Beregne en kumulativ sum
- Beregne et glidende gjennomsnitt
- Beregne antall elementer innenfor et område
- Få det mest populære elementet i hver kategori
- få den siste verdien i et område
- beregne rang
disse spørringene bruker et navngitt vindu:
- Få den siste verdien i et område
- Bruk et navngitt vindu i en vindusramme
Definere vindusspesifikasjonen
window_specification: ] ]
Beskrivelse
Definerer spesifikasjonene for vinduet.
-
named_window
: navnet på et eksisterende vindu som var definert med enWINDOW
– klausul.
- Flere partisjonsuttrykk er tillatt i
PARTITION BY
– setningsdelen. - et uttrykk kan ikke inneholde flyttallstyper, ikke-grupperbare typer, konstanter eller analytiske funksjoner.
- hvis denne valgfrie klausulen ikke brukes, alle rader i input table en enkelt partisjon.
-
window_frame_clause
: For aggregate analyticfunctions, definerer vindusrammen i gjeldende partisjon.Vindusrammen bestemmer hva som skal inkluderes i vinduet.Hvis denne klausulen brukes, krevesORDER BY
bortsett fra fullyunbounded windows.
PARTITION BY
: Bryter opp inngangsrader i separate partisjoner, oversom den analytiske funksjonen er uavhengig evaluert.
ORDER BY
: Definerer hvordan rader bestilles i en partisjon.Denne klausulen er valgfri i de fleste situasjoner, men kreves i noen tilfeller for navigasjonsfunksjoner.
Merknader
hvis verkenORDER BY
klausul eller vindusrammeklausul er til stede, inneholder vindusrammen alle rader i den partisjonen.
for aggregerte analytiske funksjoner, hvisORDER BY
– klausulen finnes, men vindusrammeklausulen er ikke, brukes følgende vindusrammeklausul som standard:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
følgende spørringer er for eksempel ekvivalente:
SELECT book, LAST_VALUE(item) OVER (ORDER BY year)FROM Library
SELECT book, LAST_VALUE(item) OVER ( ORDER BY year RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)FROM Library
Regler for bruk av et navngitt vindu i vinduspesifikasjonen
Hvis du bruker et navngitt vindu i vinduspesifikasjonene dine, gjelder disse reglene:
- spesifikasjonene i det navngitte vinduet kan utvides med nye spesifikasjoner som du definerer i vindusspesifikasjonsklausulen.
- du kan ikke ha overflødige definisjoner. Hvis du har en
ORDER BY
klausuli det navngitte vinduet og vinduspesifikasjonsklausulen, kastes anerror. -
rekkefølgen av klausuler er viktig.
PARTITION BY
må komme først, etterfulgt avORDER BY
ogwindow_frame_clause
. Hvis du legger til et navngitt vindu, behandles vinduets spesifikasjoner først.--this works:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW item_window AS (ORDER BY purchases)--this does not work:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ORDER BY purchases) AS most_popularFROM ProduceWINDOW item_window AS (ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
-
et navngitt vindu og
PARTITION BY
kan ikke vises sammen i vinduspesifikasjonen. Hvis du trengerPARTITION BY
, legg den til det navngitte vinduet. -
Du kan ikke referere til et navngitt vindu i en
ORDER BY
– klausul, en ytre spørring eller en delquery. - Beregne en delsum
- Beregne en kumulativ sum
- Få det mest populære elementet i hver kategori
- Få den siste verdien i et område
- Beregne rangering
- Bruk et navngitt vindu i en vindusramme
- Få den siste verdien i et område
- Bruk et navngitt vindu i en vindusramme
- Beregne en delsum
- Beregne en kumulativ sum
- Beregne et glidende gjennomsnitt
- Beregne antall elementer innenfor et område
- Få det mest populære elementet i hver kategori
- Få den siste verdien i et område
- Beregne rang
- Bruk et navngitt vindu i en vindusramme
Eksempler som bruker vindusspesifikasjonen
disse spørringene definerer partisjoner i en analytisk funksjon:
disse spørringene inkluderer et navngitt vindu i en vindusspesifikasjon:
disse spørringene definerer hvordan rader bestilles i en partisjon:
Definere vindusrammen klausul
window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }frame_between: { BETWEEN unbounded_preceding AND frame_end_a | BETWEEN numeric_preceding AND frame_end_a | BETWEEN current_row AND frame_end_b | BETWEEN numeric_following AND frame_end_c }frame_start: { unbounded_preceding | numeric_preceding | }frame_end_a: { numeric_preceding | current_row | numeric_following | unbounded_following }frame_end_b: { current_row | numeric_following | unbounded_following }frame_end_c: { numeric_following | unbounded_following }unbounded_preceding: UNBOUNDED PRECEDINGnumeric_preceding: numeric_expression PRECEDINGunbounded_following: UNBOUNDED FOLLOWINGnumeric_following: numeric_expression FOLLOWINGcurrent_row: CURRENT ROW
Vindusrammeklausulen definerer vindusrammen rundt den gjeldende raden innen Partisjonen, som analysefunksjonen evalueres over.Bare aggregerte analytiske funksjoner kan bruke en vindusrammeklausul.
-
rows_range
: en klausul som definerer en vindusramme med fysiske radereller et logisk område.-
ROWS
: Beregner vindusrammen basert på fysiske forskyvninger fra gjeldende rad. Du kan for eksempel inkludere to rader før og etterden nåværende raden. -
RANGE
: Beregner vindusrammen basert på et logisk radområde rundt gjeldende rad, basert på gjeldende radsORDER BY
nøkkelverdi.Den angitte områdeverdien legges til eller trekkes fra den gjeldende row ‘ skey-verdien for å definere en start-eller sluttgrensegrense for vindusrammen. I en områdebasert vindusramme må det være nøyaktig enuttrykk iORDER BY
– klausulen, og uttrykket må ha anumerisk type.
Tips: hvis du vil bruke et område med en dato, bruk
ORDER BY
medUNIX_DATE()
– funksjonen. Hvis du vil bruke et område med et tidsstempel,brukUNIX_SECONDS()
UNIX_MILLIS()
ellerUNIX_MICROS()
– funksjonen. -
-
frame_between
: Oppretter en vindusramme med en nedre og øvre grense.Den første grensen representerer den nedre grensen. Den andre grensenrepresenterer den øvre grensen. Bare visse grensekombinasjoner kan værebrukes, som vist i forrige syntaks.- Definer begynnelsen av vindusrammen med
unbounded_preceding
numeric_preceding
numeric_following
ellercurrent_row
.-
unbounded_preceding
: vindusrammen starter i begynnelsen av partisjonen. -
numeric_preceding
ellernumeric_following
: starten på windowframe er i forhold til gjeldende rad. -
current_row
: vindusrammen starter på gjeldende rad.
-
- Definer slutten på vindusrammen med
numeric_preceding
numeric_following
current_row
ellerunbounded_following
.-
numeric_preceding
ellernumeric_following
: slutten av windowframe er i forhold til gjeldende rad. -
current_row
: Vindusrammen slutter på gjeldende rad. -
unbounded_following
: vindusrammen slutter på slutten avpartisjon.
-
- Definer begynnelsen av vindusrammen med
-
frame_start
: Oppretter en vindusramme med en nedre grense.Vindusrammen slutter på gjeldende rad.-
unbounded_preceding
: vindusrammen starter i begynnelsen avpartisjon. -
numeric_preceding
: starten på vindusrammen er i forhold til gjeldende rad. -
current_row
: vindusrammen starter på gjeldende rad.
-
-
numeric_expression
: et uttrykk som representerer en numerisk type.Det numeriske uttrykket må være en konstant, ikke-negativ heltalleller parameter.
Merknader
hvis en grense strekker seg utover begynnelsen eller slutten av en partisjon,vil vindusrammen bare inkludere rader fra den partisjonen.
du kan ikke bruke en vindusrammeklausul mednavigasjonsfunksjoner ognummereringsfunksjoner, for eksempel RANK()
.
Eksempler som bruker vindusramme
disse spørringene beregner verdier med ROWS
:
- Beregn en kumulativ sum
- Beregn et glidende gjennomsnitt
- Få det mest populære elementet i hver kategori
- Få den siste verdien i et område
- Bruk et navngitt vindu i en vindusramme
disse spørringene beregner verdier med RANGE
:
- antall elementer i et område
disse spørringene beregner verdier med et delvis eller helt ubundet vindu:
disse spørringene beregne verdier med numeriske grenser:
- Beregne en kumulativ sum
- Beregne et glidende gjennomsnitt
- Beregne antall elementer i en
- få Den Siste Verdien i et område
- Bruk et navngitt vindu i en vindusramme
disse spørringene beregner Verdier med gjeldende rad som en grense:
- Beregne en totalsum
- Beregne en delsum
- Beregne en kumulativ sum
Referere til et navngitt vindu
SELECT query_expr, analytic_function_name ( ) OVER over_clauseFROM from_itemWINDOW named_window_expression over_clause: { named_window | ( ) }window_specification: ] ] named_window_expression: named_window AS { named_window | ( ) }
et navngitt vindu representerer en gruppe rader i en tabell som ananalytisk funksjon kan brukes på. Et navngitt vindu er definert iWINDOW
– klausulen, og referert til i en analytisk funksjons OVER
clause.In enOVER
– klausul, et navngitt vindu kan vises enten av seg selv eller innebygd i en vindusspesifikasjon.
Eksempler
- Få den siste verdien i et område
- Bruk et navngitt vindu i en vindusramme
navigasjonsfunksjonskonsepter
Navigasjonsfunksjoner beregner vanligvis noenvalue_expression
over en annen rad i vindusrammen fra gjeldende rad. OVER
setningssyntaksen varierer på tvers av navigasjonsfunksjoner.
Krav til OVER
klausul:
-
PARTITION BY
: Valgfritt. -
ORDER BY
:- Disallowed for
PERCENTILE_CONT
andPERCENTILE_DISC
. - Required for
FIRST_VALUE
LAST_VALUE
NTH_VALUE
LEAD
andLAG
.
- Disallowed for
-
window_frame_clause
:- Disallowed for
PERCENTILE_CONT
PERCENTILE_DISC
LEAD
andLAG
. - Optional for
FIRST_VALUE
LAST_VALUE
, andNTH_VALUE
.
- Disallowed for
for alle navigasjonsfunksjoner er resultatdatatypen den samme typen som value_expression
.
nummereringsfunksjonskonsepter
Nummereringsfunksjoner tilordne heltallverdier tilhver rad basert på deres posisjon i det angitte vinduet.
Eksempel påRANK()
DENSE_RANK()
ogROW_NUMBER()
:
WITH Numbers AS (SELECT 1 as x UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 5 UNION ALL SELECT 8 UNION ALL SELECT 10 UNION ALL SELECT 10)SELECT x, RANK() OVER (ORDER BY x ASC) AS rank, DENSE_RANK() OVER (ORDER BY x ASC) AS dense_rank, ROW_NUMBER() OVER (ORDER BY x) AS row_numFROM Numbers+---------------------------------------------------+| x | rank | dense_rank | row_num |+---------------------------------------------------+| 1 | 1 | 1 | 1 || 2 | 2 | 2 | 2 || 2 | 2 | 2 | 3 || 5 | 4 | 3 | 4 || 8 | 5 | 4 | 5 || 10 | 6 | 5 | 6 || 10 | 6 | 5 | 7 |+---------------------------------------------------+
-
RANK()
: For x=5 errank
4, sidenRANK()
øker med antall jevnaldrende i forrige vindubestillingsgruppe. -
ROW_NUMBER()
: for x=5,row_num
er 4.
DENSE_RANK()
: for x=5,dense_rank
er 3, sidenDENSE_RANK()
alwaysincrments med 1, hopper aldri over en verdi.
Aggregate analytic function concepts
en aggregatfunksjon er en funksjon som utfører en beregning på asett av verdier. De fleste aggregatfunksjoner kan brukes i ananalytisk funksjon. Disse aggregerte funksjonene kallesaggregerte analytiske funksjoner.
med aggregerte analytiske funksjoner leggesOVER
– klausulen til det aggregerte funksjonskallet; syntaksen for funksjonskallet forblir ellers uendret.Som deres aggregerte funksjonsmodeller utfører disse analytiske funksjoneneaggregasjoner, men spesielt over den aktuelle vindusrammen for hver rad.Resultatdatatypene for disse analytiske funksjonene er de samme som deresaggregerte funksjonsmodeller.
Eksempler På Analytiske funksjoner
i disse eksemplene er det uthevede elementet gjeldende rad. Boldeditems er radene som inngår i analysen.
Vanlige tabeller som brukes i eksempler
følgende tabeller brukes i de påfølgende aggregate analyticquery-eksemplene: Produce
Employees
og Farm
.
Produser tabell
noen eksempler refererer til en tabell kalt Produce
:
WITH Produce AS (SELECT 'kale' as item, 23 as purchases, 'vegetable' as category UNION ALL SELECT 'orange', 2, 'fruit' UNION ALL SELECT 'cabbage', 9, 'vegetable' UNION ALL SELECT 'apple', 8, 'fruit' UNION ALL SELECT 'leek', 2, 'vegetable' UNION ALL SELECT 'lettuce', 10, 'vegetable')SELECT * FROM Produce+-------------------------------------+| item | category | purchases |+-------------------------------------+| kale | vegetable | 23 || orange | fruit | 2 || cabbage | vegetable | 9 || apple | fruit | 8 || leek | vegetable | 2 || lettuce | vegetable | 10 |+-------------------------------------+
Ansatte tabell
noen eksempler refererer til en tabell kalt Employees
:
WITH Employees AS (SELECT 'Isabella' as name, 2 as department, DATE(1997, 09, 28) as start_date UNION ALL SELECT 'Anthony', 1, DATE(1995, 11, 29) UNION ALL SELECT 'Daniel', 2, DATE(2004, 06, 24) UNION ALL SELECT 'Andrew', 1, DATE(1999, 01, 23) UNION ALL SELECT 'Jacob', 1, DATE(1990, 07, 11) UNION ALL SELECT 'Jose', 2, DATE(2013, 03, 17))SELECT * FROM Employees+-------------------------------------+| name | department | start_date |+-------------------------------------+| Isabella | 2 | 1997-09-28 || Anthony | 1 | 1995-11-29 || Daniel | 2 | 2004-06-24 || Andrew | 1 | 1999-01-23 || Jacob | 1 | 1990-07-11 || Jose | 2 | 2013-03-17 |+-------------------------------------+
Farm tabell
noen eksempler refererer til en tabell kalt Farm
:
WITH Farm AS (SELECT 'cat' as animal, 23 as population, 'mammal' as category UNION ALL SELECT 'duck', 3, 'bird' UNION ALL SELECT 'dog', 2, 'mammal' UNION ALL SELECT 'goose', 1, 'bird' UNION ALL SELECT 'ox', 2, 'mammal' UNION ALL SELECT 'goat', 2, 'mammal')SELECT * FROM Farm+-------------------------------------+| animal | category | population |+-------------------------------------+| cat | mammal | 23 || duck | bird | 3 || dog | mammal | 2 || goose | bird | 1 || ox | mammal | 2 || goat | mammal | 2 |+-------------------------------------+
beregn en totalsum
dette beregner en totalsum for alle elementer iProduce
tabellen.
- (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
- (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
- (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
- (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
- (appelsin, eple, purre, kål, salat, grønnkål) kale) = 54 totale kjøp
- (appelsin, eple, purre, kål, salat, grønnkål) = 54 totale kjøp
SELECT item, purchases, category, SUM(purchases) OVER () AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 54 || leek | 2 | vegetable | 54 || apple | 8 | fruit | 54 || cabbage | 9 | vegetable | 54 || lettuce | 10 | vegetable | 54 || kale | 23 | vegetable | 54 |+-------------------------------------------------------+
beregn en delsum
dette beregner en delsum for hver kategori iProduce
tabell.
- frukt
- (appelsin, eple) = 10 totale kjøp
- grønnsak
- (purre, kål, salat, grønnkål) = 44 totale kjøp
- (purre, kål, salat, grønnkål) = 44 totale kjøp
- (purre, kål, salat, grønnkål) = 44 totale kjøp
- (purre, kål, salat, grønnkål) = 44 totale kjøp
- /li>
- (purre, kål, salat, grønnkål) = 44 totale kjøp
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 10 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 44 || cabbage | 9 | vegetable | 44 || lettuce | 10 | vegetable | 44 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
beregn en kumulativ sum
dette beregner en kumulativ sum for hver kategori i Produce
tabellen. Summen beregnes med hensyn til teorder definert ved hjelp avORDER BY
– klausulen.
- frukt
- (appelsin, eple) = 2 totale kjøp
- (appelsin, eple) = 10 totale kjøp
- grønnsak
- (purre, kål, salat, grønnkål) = 21 totale kjøp
- (purre, kål, salat, grønnkål) = 44 totalt kjøp
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 2 || cabbage | 9 | vegetable | 11 || lettuce | 10 | vegetable | 21 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
dette gjør det samme som det foregående eksemplet. Du trenger ikke å legge tilCURRENT ROW
som en grense med mindre du vil for lesbarhet.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
i dette eksemplet er alle elementer i Produce
tabellen inkluderti partisjonen. Bare foregående rader analyseres. Analysen starter tworows før gjeldende rad i partisjonen.
- (oransje, purre, eple, kål, salat, grønnkål) = NULL
- (oransje, purre, eple, kål, salat, grønnkål) = NULL
- (oransje, purre, eple, kål, salat, grønnkål) = 2
- (oransje, purre, eple, kål, salat, grønnkål) = 4
- (oransje, purre, eple, kål, salat, grønnkål) = 12
- (oransje, purre, eple, kål, salat, grønnkål) = 21
SELECT item, purchases, category, SUM(purchases) OVER ( ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING ) AS total_purchasesFROM Produce;+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | NULL || leek | 2 | vegetable | NULL || apple | 8 | fruit | 2 || cabbage | 9 | vegetable | 4 || lettuce | 10 | vegetable | 12 || kale | 23 | vegetable | 21 |+-------------------------------------------------------+
beregn et glidende gjennomsnitt
dette beregner et glidende gjennomsnitt iProduce
tabellen.Den nedre grensen er 1 rad førnåværende rad. Den øvre grensen er 1 rad etter gjeldende rad.
- (oransje, purre, eple, kål, salat, grønnkål) = 2 gjennomsnittlig kjøp
- (oransje, purre, eple, kål, salat, grønnkål) = 4 gjennomsnittlig kjøp
- (oransje, purre, eple, kål, salat, grønnkål) = 6.3333 gjennomsnittlig kjøp
- (oransje, purre, eple, kål, salat, grønnkål) = 9 gjennomsnittlig kjøp
- (oransje, purre, eple, kål, salat, grønnkål) = 9 gjennomsnittlig kjøp
- (oransje, purre, eple, kål, salat, grønnkål), kale) = 14 gjennomsnittlig kjøp
- (appelsin, purre, eple, kål, salat, grønnkål) = 16.5 gjennomsnittlig kjøp
SELECT item, purchases, category, AVG(purchases) OVER ( ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS avg_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | avg_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || leek | 2 | vegetable | 4 || apple | 8 | fruit | 6.33333 || cabbage | 9 | vegetable | 9 || lettuce | 10 | vegetable | 14 || kale | 23 | vegetable | 16.5 |+-------------------------------------------------------+
Beregn antall elementer innenfor et område
dette eksemplet får antall dyr som har en lignende populationcount iFarm
tabellen.
- (gås, hund, okse, geit, and, katt) = 4 dyr mellom populasjonsområde 0-2.
- (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
- (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
- (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
- (gås, hund, okse, geit, and, katt) = 4 dyr mellom populasjonsområde 2-4.
- (gås, hund, okse, geit, and, katt) = 1 dyr mellom populasjonsområde 22-24.
SELECT animal, population, category, COUNT(*) OVER ( ORDER BY population RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS similar_populationFROM Farm;+----------------------------------------------------------+| animal | population | category | similar_population |+----------------------------------------------------------+| goose | 1 | bird | 4 || dog | 2 | mammal | 5 || ox | 2 | mammal | 5 || goat | 2 | mammal | 5 || duck | 3 | bird | 4 || cat | 23 | mammal | 1 |+----------------------------------------------------------+
Få det mest populære elementet i hver kategori
dette eksemplet får det mest populære elementet i hver kategori. Den definerer hvordan rader i et vindu er partisjonert og bestilt i hver partisjon. Produce
tabellen er referert.
- frukt
- (appelsin, eple) = eple er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- /li>
- (purre, kål, salat, grønnkål)=grønnkål er mest populær
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | kale || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
få den siste verdien i et område
dette eksemplet får det mest populære elementet i en bestemt vindusramme, ved hjelp av Produce
Tabell. Vindusrammen analyserer opptil trerader om gangen. Ta en nærmere titt påmost_popular
kolonne for grønnsaker.I stedet for å få det mest populære elementet i en bestemt kategori, blir det mest populære elementet i et bestemt område i den kategorien.
- frukt
- (appelsin, eple) = eple er mest populær
- (purre, kål, salat, grønnkål) = kål er mest populær
- (purre, kål, salat, grønnkål) = salat er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
- /li>
- (purre, kål, salat, grønnkål) = grønnkål er mest populær
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | cabbage || cabbage | 9 | vegetable | lettuce || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
dette eksemplet returnerer de samme resultatene som det forrige eksemplet, men det inkludereret navngitte vindu kalt item_window
. Noen av vinduspesifikasjonene er definert direkte iOVER
– klausulen, og noen er definert i det navngitte vinduet.
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases)
Compute rank
dette eksemplet beregner rangen til hver ansatt i avdelingen,basert på startdato. Vindusspesifikasjonen er definert direkteiOVER
– klausulen. Employees
tabellen er referert.
- avdeling 1
- (Jacob, Anthony, Andrew) = Tilordne rang 1 Til Jacob
- (Jacob, Anthony, Andrew) = Tilordne rang 2 til Anthony
- (Jacob, Anthony, Andrew) = Tilordne rang 3 til Andrew
- avdeling 2
- (Isabella, Daniel, Jose) = Tilordne rang 1 Til Isabella
- (Isabella, Daniel, Jose) = Tilordne rang 2 til Isabella daniel
- (isabella, daniel, jose) = tilordne rang 3 Til Jose
SELECT name, department, start_date, RANK() OVER (PARTITION BY department ORDER BY start_date) AS rankFROM Employees;+--------------------------------------------+| name | department | start_date | rank |+--------------------------------------------+| Jacob | 1 | 1990-07-11 | 1 || Anthony | 1 | 1995-11-29 | 2 || Andrew | 1 | 1999-01-23 | 3 || Isabella | 2 | 1997-09-28 | 1 || Daniel | 2 | 2004-06-24 | 2 || Jose | 2 | 2013-03-17 | 3 |+--------------------------------------------+
Bruk Et Navngitt vindu i En Vindusramme
du kan definere noe av logikken din i et navngitt vindu og noe Av det I awindow frame klausul. Denne logikken er kombinert. Her er et eksempel ved å bruke tabellenProduce
.
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)+-------------------------------------------------------+| item | purchases | category | most_popular |+-------------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | lettuce || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+-------------------------------------------------------+
du kan også få de tidligere resultatene med disse eksemplene:
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), c AS (b ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING), item_window AS (c)
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), item_window AS (b)
følgende eksempel gir en feil fordi en vindusrammeklausul har blitt definert to ganger:
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Leave a Reply