analytiska funktionskoncept i standard SQL
en analytisk funktion beräknar värden över en grupp rader och returnerar ett enda resultat för varje rad. Detta skiljer sig från en aggregerad funktion,som returnerar ett enda resultat för en grupp rader.
en analysfunktion innehåller enOVER
– klausul, som definierar ett fönster med radarrunt raden som utvärderas. För varje rad resulterar den analytiska funktionenberäknas med det valda fönstret i rader som inmatning, möjligtgör aggregering.
med analytiska funktioner kan du beräkna glidande medelvärden, rangordna objekt, beräkna kumulativa summor och utföra andra analyser.
följande funktioner kan användas som analytiska funktioner: navigeringsfunktioner, numreringsfunktioner ochaggregera analytiska funktioner
analytisk funktion syntax
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
noteringsregler
- hakparenteser ”” anger valfria klausuler.
- parenteser ”() ” anger bokstavliga parenteser.
- den vertikala stapeln ” / ” indikerar en logisk eller.
- Curly braces ”{ } ” bifoga en uppsättning alternativ.
- ett komma följt av en ellips inom hakparenteser ”” indikerar attDet föregående objektet kan upprepas i en kommaseparerad lista.
beskrivning
en analysfunktion beräknar resultat över en grupp rader. Du kan använda följande syntax för att bygga en analytisk funktion:
-
analytic_function_name
: funktionen som utför en analytisk operation.Till exempel kan numreringsfunktionenRANK()
användas här. -
argument_list
: argument som är specifika för den analytiska funktionen.Vissa funktioner har dem, vissa gör det inte. -
OVER
: nyckelord som krävs i analytisk funktion syntax prejudictheOVER
klausul. -
over_clause
: refererar till ett fönster som definierar en grupp av rader i en tabell för att använda en analysfunktion. -
window_specification
: definierar specifikationerna förfönstret. -
window_frame_clause
: definierar fönsterramenför fönstret. -
rows_range
: definierar de fysiska raderna eller alogiska intervallet för en fönsterram.
anteckningar
en analysfunktion kan visas som ett skalärt uttryck operand intvå platser i frågan:
-
SELECT
listan. Om den analytiska funktionen visas iSELECT
– listan kan dess argumentlista ochOVER
– klausulen inte hänvisa till alias som introducerades i samma SELECT-lista. -
ORDER BY
klausul. Om den analytiska funktionen visas iORDER BY
– klausulen i frågan kan dess argumentlista hänvisa tillSELECT
listalias.
en analytisk funktion kan inte referera till en annan analytisk funktion i dessargumentlista eller dessOVER
klausul, även indirekt genom ett alias.
en analytisk funktion utvärderas efter aggregering. Till exempel utvärderasGROUP BY
-klausulen och icke-analytiska aggregatfunktioner först.Eftersom aggregerade funktioner utvärderas före analytiska funktioner kan aggregerade funktioner användas som inmatningsoperander till analytiska funktioner.
returnerar
ett enda resultat för varje rad i inmatningen.
definiera överklausulen
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
beskrivning
OVER
klausul refererar till ett fönster som definierar en grupp rader i en tabellpå vilken en analysfunktion ska användas. Du kan ange ettnamed_window
som ärdefinierat i din fråga, eller du kandefiniera specifikationerna för ett nytt fönster.
anteckningar
om varken ett namngivet fönster eller fönsterspecifikation tillhandahålls ingår allinput-rader i fönstret för varje rad.
exempel medOVER
klausul
dessa frågor använder fönsterspecifikationer:
- Beräkna en totalsumma
- Beräkna en kumulativ summa
- beräkna ett glidande medelvärde
- beräkna antalet objekt inom ett intervall
- få det mest populära objektet i varje kategori
- hämta det sista värdet i ett intervall
- compute rank
dessa frågor använder ett namngivet fönster:
- hämta det sista värdet i ett intervall
- Använd ett namngivet fönster i en fönsterramsats
definiera fönsterspecifikationen
window_specification: ] ]
beskrivning
definierar specifikationerna för fönstret.
-
named_window
: namnet på ett befintligt fönster som vardefinierat med enWINDOW
klausul.
-
PARTITION BY
: bryter upp ingångsraderna i separata partitioner, översom den analytiska funktionen utvärderas oberoende.- flera partitionsuttryck är tillåtna i
PARTITION BY
– klausulen. - ett uttryck kan inte innehålla flyttalstyper, icke-grupperbara typer, konstanter eller analytiska funktioner.
- om denna valfria klausul inte används, alla rader i inmatningstabellenkomprisera en enda partition.
- flera partitionsuttryck är tillåtna i
-
ORDER BY
: definierar hur rader beställs inom en partition.Denna klausul är valfri i de flesta situationer, men krävs i vissafall för navigeringsfunktioner. -
window_frame_clause
: För aggregate analyticfunktioner, definierar fönsterramen inom den aktuella partitionen.Fönsterramen bestämmer vad som ska inkluderas i fönstret.Om denna klausul används krävsORDER BY
förutom fullt avgränsade fönster.
anteckningar
om varkenORDER BY
eller fönsterramsklausul finns,innehåller fönsterramen alla rader i den partitionen.
för aggregerade analytiska funktioner, omORDER BY
klausul är närvarande menfönsterramsklausulen är inte följande fönsterramklausulanvänds som standard:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
till exempel är följande frågor likvärdiga:
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 för att använda ett namngivet fönster i fönsterspecifikationen
Om du använder ett namngivet fönster i dina fönsterspecifikationer gäller dessa regler:
- specifikationerna i det angivna fönstret kan utökasmed nya specifikationer som du definierar i fönsterspecifikationsklausulen.
- Du kan inte ha överflödiga definitioner. Om du har ett
ORDER BY
clausei det namngivna fönstret och fönsterspecifikationsklausulen kastas anerror. -
klausulernas ordning är viktig.
PARTITION BY
måste komma först, följt avORDER BY
ochwindow_frame_clause
. Om du lägger till ett namngivet fönster behandlas dess fönsterspecifikationer 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)
-
ett namngivet fönster och
PARTITION BY
kan inte visas tillsammans i fönsterspecifikationen. Om du behöverPARTITION BY
, Lägg till det i det namngivna fönstret. -
Du kan inte referera till ett namngivet fönster i
ORDER BY
, en yttre fråga eller någon underfråga.
exempel med fönsterspecifikationen
dessa frågor definierar partitioner i en analysfunktion:
- Beräkna en delsumma
- Beräkna en kumulativ summa
- få det mest populära objektet i varje kategori
- hämta det sista värdet i ett intervall
- beräkna rang
- Använd ett namngivet fönster i en fönsterramsklausul
dessa frågor inkluderar ett namngivet fönster i en fönsterspecifikation:
- hämta det sista värdet i ett intervall
- Använd ett namngivet fönster i en fönsterramsats
dessa frågor definierar hur rader beställs i en partition:
- Beräkna en delsumma
- Beräkna en kumulativ summa
- beräkna ett glidande medelvärde
- beräkna antalet objekt inom ett intervall
- få det mest populära objektet i varje kategori
- hämta det sista värdet i ett intervall
- beräkna rang
- Använd ett namngivet fönster i en fönsterramsklausul
definiera fönsterramen 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
Fönsterramsklausulen definierar fönsterramen runt den aktuella raden meden partition, över vilken analysfunktionen utvärderas.Endast aggregerade analytiska funktioner kan använda en fönsterramsklausul.
-
rows_range
: en klausul som definierar en fönsterram med fysiska radareller ett logiskt intervall.-
ROWS
: beräknar fönsterramen baserat på fysiska förskjutningar från den aktuella raden. Du kan till exempel inkludera två rader före och efterden aktuella raden. -
RANGE
: beräknar fönsterramen baserat på ett logiskt radintervall runt den aktuella raden, baserat på den aktuella radensORDER BY
nyckelvärde.Det angivna intervallvärdet läggs till eller subtraheras till det aktuella radskey-värdet för att definiera en start-eller slutgräns för fönsterramen. I en intervallbaserad fönsterram måste det finnas exakt enuttryck iORDER BY
– klausulen, och uttrycket måste ha anumerisk typ.
tips: om du vill använda ett intervall med ett datum, använd
ORDER BY
med funktionenUNIX_DATE()
. Om du vill använda ett intervall med en tidsstämpel använder du funktionenUNIX_SECONDS()
UNIX_MILLIS()
ellerUNIX_MICROS()
. -
-
frame_between
: skapar en fönsterram med en nedre och övre gräns.Den första gränsen representerar den nedre gränsen. Den andra gränsenrepresenterar den övre gränsen. Endast vissa gränskombinationer kan varaanvänds, som visas i föregående syntax.- definiera början av fönsterramen med
unbounded_preceding
numeric_preceding
numeric_following
, ellercurrent_row
.-
unbounded_preceding
: fönsterramen börjar i början avpartition. -
numeric_preceding
ellernumeric_following
: fönstrets start är relativt den aktuella raden. -
current_row
: fönsterramen startar vid den aktuella raden.
-
- definiera slutet på fönsterramen med
numeric_preceding
numeric_following
current_row
, ellerunbounded_following
.-
numeric_preceding
ellernumeric_following
: fönstrets slut är relativt den aktuella raden. -
current_row
: Fönsterramen slutar vid den aktuella raden. -
unbounded_following
: fönsterramen slutar i slutet avpartition.
-
- definiera början av fönsterramen med
-
frame_start
: skapar en fönsterram med en nedre gräns.Fönsterramen slutar vid den aktuella raden.-
unbounded_preceding
: fönsterramen börjar i början avpartition. -
numeric_preceding
: fönsterramens start är relativt den aktuella raden. -
current_row
: fönsterramen startar vid den aktuella raden.
-
-
numeric_expression
: ett uttryck som representerar en numerisk typ.Det numeriska uttrycket måste vara en konstant, icke-negativ helteller parameter.
anteckningar
om en gräns sträcker sig bortom början eller slutet av en partition kommer fönsterramen endast att innehålla rader inifrån den partitionen.
Du kan inte använda en fönsterramsklausul mednavigeringsfunktioner och numreringsfunktioner, till exempel RANK()
.
exempel med hjälp av fönsterramsklausulen
dessa frågor beräknar värden med ROWS
:
- Beräkna en kumulativ summa
- beräkna ett glidande medelvärde
- få det mest populära objektet i varje kategori
- få det sista värdet i ett intervall
- Använd ett namngivet fönster i en fönsterramsklausul
dessa frågor beräknar värden med RANGE
:
- beräkna värdet i en antal objekt inom ett intervall
dessa frågor beräknar värden med ett helt eller delvis obundet fönster:
- Beräkna en totalsumma
- Beräkna en delsumma
- Beräkna en kumulativ summa
- få det mest populära objektet i varje kategori
- beräkna rank
dessa frågor beräknar värden med numeriska gränser:
- Beräkna en kumulativ summa
- beräkna ett glidande medelvärde
- beräkna antalet objekt inom en range
- hämta det sista värdet i ett intervall
- Använd ett namngivet fönster i en fönsterramsats
dessa frågor beräknar värden med den aktuella raden som en gräns:
- Beräkna en totalsumma
- Beräkna en delsumma
- Beräkna en kumulativ summa
referera till ett namngivet fönster
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 | ( ) }
ett namngivet fönster representerar en grupp rader i en tabell för att använda ananalytisk funktion. Ett namngivet fönster definieras iWINDOW
– klausulen och refereras till Inan analytic-funktionens OVER
clause.In enOVER
– klausul, ett namngivet fönster kan visas antingen av sig själv eller inbäddasinom en fönsterspecifikation.
exempel
- hämta det sista värdet i ett intervall
- Använd ett namngivet fönster i en fönsterramsklausul
navigationsfunktionskoncept
navigationsfunktioner beräknar i allmänhet någravalue_expression
över en annan rad i fönsterramen från den aktuella raden. OVER
klausulsyntaxen varierar mellan navigeringsfunktioner.
krav förOVER
klausul:
-
PARTITION BY
: valfritt. -
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
för alla navigeringsfunktioner är resultatdatatypen samma typ somvalue_expression
.
Numreringsfunktionskoncept
Numreringsfunktioner tilldela heltalvärden tillvarje rad baserat på deras position i det angivna fönstret.
exempel på RANK()
DENSE_RANK()
och ROW_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()
: För x = 5 ärrank
4, eftersomRANK()
steg med numberof peers i föregående fönsterbeställningsgrupp. -
DENSE_RANK()
: för x = 5,dense_rank
är 3, eftersomDENSE_RANK()
alwaysincrements med 1, hoppar aldrig över ett värde. -
ROW_NUMBER()
: för x=5,row_num
är 4.
Aggregate analytic function concepts
en aggregatfunktion är en funktion som utför en beräkning på aset av värden. De flesta aggregerade funktioner kan användas i ananalytisk funktion. Dessa aggregerade funktioner kallasaggregera analytiska funktioner.
med aggregerade analytiska funktioner läggsOVER
– satsen till aggregatfunktionssamtal; syntaxen för funktionssamtal förblir annars oförändrad.Liksom deras aggregerade funktion motsvarigheter, utför dessa analytiska funktioneraggregationer, men specifikt över den relevanta fönsterramen för varje rad.Resultatdatatyperna för dessa analytiska funktioner är desamma som derasaggregatfunktion motsvarigheter.
analytiska funktionsexempel
i dessa exempel är det markerade objektet den aktuella raden. De boldeditems är de rader som ingår i analysen.
vanliga tabeller som används i exempel
Följande tabeller används i de efterföljande aggregerade analyticquery-exemplen: Produce
Employees
och Farm
.
producera tabell
några exempel hänvisar till en tabell som heter 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 |+-------------------------------------+
anställda tabell
några exempel hänvisar till en tabell som heter 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 table
några exempel hänvisar till en tabell som heter 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 |+-------------------------------------+
beräkna en totalsumma
detta beräknar en totalsumma för alla objekt iProduce
tabell.
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål)=54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, kale) = 54 totala inköp
- (apelsin, äpple, purjolök, kål, sallad, grönkål) = 54 totala inkö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 |+-------------------------------------------------------+
beräkna en delsumma
detta beräknar en delsumma för varje kategori i Produce
tabell.
- frukt
- (apelsin, äpple) = 10 totala inköp
- (apelsin, äpple) = 10 totala inköp
- vegetabiliska
- (purjolök, kål, sallad, grönkål) = 44 totala inköp
- (purjolök, kål, sallad, grönkål) = 44 totala inköp
- (purjolök, kål, sallad, grönkål) = 44 totala inköp
- (purjolök, kål, sallad, grönkål) = 44 totala inköp
- /li>
- (purjolök, kål, sallad, grönkål)=44 totala inkö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 |+-------------------------------------------------------+
beräkna en kumulativ summa
detta beräknar en kumulativ summa för varje kategori i Produce
tabell. Summan beräknas med avseende på theorder definieras medORDER BY
klausul.
- frukt
- (apelsin, äpple) = 2 totala inköp
- (apelsin, äpple) = 10 totala inköp
- vegetabiliska
- (purjolök, kål, sallad, grönkål) = 2 totala inköp
- (purjolök, kål, sallad, grönkål) = 11 totala inköp
- (purjolök, kål, sallad, grönkål) = 21 totala inköp
- (purjolök, kål, sallad, grönkål) = 44 totala inkö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 |+-------------------------------------------------------+
detta gör samma sak som föregående exempel. Du behöver inte lägga tillCURRENT ROW
som en gräns om du inte vill läsa.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
i det här exemplet ingår alla objekt i Produce
tabelleni partitionen. Endast föregående rader analyseras. Analysen startar två rader före den aktuella raden i partitionen.
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = NULL
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = NULL
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 4
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 12
- (apelsin, purjolök, äpple, kål, sallad, grönkå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 |+-------------------------------------------------------+
beräkna ett glidande medelvärde
detta beräknar ett rörligt medelvärde iProduce
tabell.Den nedre gränsen är 1 rad förenuvarande rad. Den övre gränsen är 1 rad efter den aktuella raden.
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 2 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 4 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 6.3333 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 9 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 9 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 9 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 14 genomsnittliga inköp
- (apelsin, purjolök, äpple, kål, sallad, grönkål) = 16.5 genomsnittliga inkö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 |+-------------------------------------------------------+
beräkna antalet objekt inom ett intervall
detta exempel får antalet djur som har en liknande befolkningräkna i Farm
tabell.
- (gås, hund, Oxe, get, anka, katt) = 4 djur mellan populationsintervallet 0-2.
- (gås, hund, Oxe, get, anka, katt) = 5 djur mellan populationsintervall 1-3.
- (gås, hund, Oxe, get, anka, katt) = 5 djur mellan populationsintervall 1-3.
- (gås, hund, Oxe, get, anka, katt) = 5 djur mellan populationsintervall 1-3.
- (gås, hund, Oxe, get, anka, katt) = 4 djur mellan populationsintervallet 2-4.
- (gås, hund, Oxe, get, anka, katt) = 1 Djur mellan populationsintervallet 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ära objektet i varje kategori
det här exemplet får det mest populära objektet i varje kategori. Det definierar hur radari ett fönster partitioneras och beställs i varje partition. TabellenProduce
refereras till.
- fruit
- (apelsin, äpple) = apple är mest populärt
- (apelsin, äpple) = apple är mest populärt
- vegetabiliska
- (blomkål, vitkål, sallad, grönkål) = grönkål är mest populärt
- (blomkål, vitkål, sallad, grönkål) = grönkål är mest populärt
- (blomkål, vitkål, sallad, grönkål) = grönkål är mest populärt
- (blomkål, vitkål, sallad, grönkål) = grönkål är mest populärt
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å det sista värdet i ett intervall
Detta exempel blir den mest populära i ett visst fönster, usingthe Produce
tabell. Fönsterramen analyserar upp till trerader åt gången. Ta en närmare titt på kolumnen most_popular
för grönsaker.Istället för att få det mest populära objektet i en viss kategori blir det det mest populära objektet i ett visst intervall i den kategorin.
- frukt
- (apelsin, äpple) = äpple är mest populära
- (apelsin, äpple) = äpple är mest populära
- vegetabiliska
- (purjolök, kål, sallad, grönkål) = kål är mest populära
- (purjolök, kål, sallad, grönkål) = sallad är mest populära
- (purjolök, kål, sallad, grönkål) = sallad är mest populära
- (purjolök, kål, sallad, grönkål) = grönkål är mest populära
- /li>
- (purjolök, kål, sallad, kale)=kale är 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 |+----------------------------------------------------+
detta exempel returnerar samma resultat som föregående exempel, men det inkluderarett namngivet fönster som heter item_window
. Några av fönsterspecifikationerna ärdefinieras direkt iOVER
och vissa definieras i det namngivna fönstret.
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
detta exempel beräknar rankningen för varje anställd inom deras avdelning,baserat på deras startdatum. Fönsterspecifikationen definieras direktiOVER
– klausulen. TabellenEmployees
refereras till.
- avdelning 1
- (Jacob, Anthony, Andrew) = tilldela rang 1 till Jacob
- (Jacob, Anthony, Andrew) = tilldela rang 2 till Anthony
- (Jacob, Anthony, Andrew) = tilldela rang 3 till Andrew
- avdelning 2
- (Isabella, Daniel, Jose) = tilldela rang 1 till Isabella
- (Isabella, Daniel, Jose) = tilldela rang 2 till Daniel
- (Isabella, Daniel, Jose) = tilldela rang 3 till 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 |+--------------------------------------------+
Använd ett namngivet fönster i en fönsterramsklausul
Du kan definiera en del av din logik i ett namngivet fönster och en del av det i ett namngivet fönster awindow frame klausul. Denna logik kombineras. Här är ett exempel medProduce
– tabellen.
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 också få de tidigare resultaten med dessa exempel:
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öljande exempel ger ett fel eftersom en fönsterramsklausul har definierats två gånger:
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