analyyttiset funktiokäsitteet standardissa SQL
analyyttinen funktio laskee arvot riviryhmälle ja palauttaa yhden tuloksen jokaiselta riviltä. Tämä eroaa aggregaattifunktiosta, joka palauttaa yhden tuloksen riviryhmälle.
analyyttiseen funktioon kuuluu OVER
lauseke, joka määrittelee arvioitavan rivin ympärillä olevan rivien ikkunan. Kullekin riville analyyttinen funktio resultisoidaan käyttäen valittua rivien ikkunaa syötteenä, possiblykeing aggregation.
analyyttisillä funktioilla voi laskea liukuvia keskiarvoja, asettaa kohteita paremmuusjärjestykseen, laskea laskennallisia summia ja tehdä muita analyysejä.
seuraavia funktioita voidaan käyttää analyyttisinä funktioina:navigointifunktiot,numerointifunktiot ja aggregaattifunktiot
analyyttisten funktioiden syntaksi
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Notaatiosäännöt
- hakasulkeet ”” ilmoitetaan valinnaiset lausekkeet.
- suluissa ”( )” merkitään kirjaimellisia sulkeita.
- pystypalkki ” / ” ilmaisee loogista tai.
- kiharaiset henkselit ”{ }” sulkevat sisäänsä joukon vaihtoehtoja.
- pilkku, jota seuraa hakasulkeissa oleva ellipsis””, osoittaa, että edellinen kohta voi toistua pilkulla erotetussa luettelossa.
kuvaus
analyyttinen funktio laskee tulokset riviryhmän yli. Analyyttisen funktion voi rakentaa seuraavalla syntaksilla:
-
analytic_function_name
: funktio, joka suorittaa analyyttisen operaation.Esimerkiksi numerointifunktiotaRANK()
voidaan käyttää tässä. -
argument_list
: analyyttiselle funktiolle ominaisia argumentteja.Joissakin toiminnoissa niitä on, joissakin ei. -
OVER
: analyyttisen funktion syntaksin vaatima AvainsanaOVER
lauseke. -
over_clause
: viittaa ikkunaan, joka määrittelee taulukon riviryhmän, jonka päällä käytetään analyyttistä funktiota. -
window_specification
: määrittelee ikkunan TEKNISET TIEDOT. -
window_frame_clause
: määrittelee ikkunan kehyksen. -
rows_range
: määrittelee ikkunakehyksen fyysiset rivit tai alogisen alueen.
toteaa
analyyttinen funktio voi esiintyä skalaarisena lausekkeena operandina kahdessa paikassa kyselyssä:
-
SELECT
lista. Jos analyyttinen funktio esiintyySELECT
– luettelossa, sen argumenttiluettelo jaOVER
– lauseke eivät voi viitata samassa luettelossa esitettyihin peitenimiin. -
ORDER BY
lauseke. Jos analyyttinen funktio esiintyy kyselynORDER BY
lausekkeessa, sen argumenttiluettelo voi viitataSELECT
list-aliaksiin.
analyyttinen funktio ei voi viitata toiseen analyyttiseen funktioon argumenttiluettelossaan tai sen OVER
lausekkeessa edes epäsuorasti aliaksen kautta.
analyyttinen funktio arvioidaan aggregoinnin jälkeen. EsimerkiksiGROUP BY
lauseke ja ei-analyyttiset aggregaattifunktiot arvioidaan ensin.Koska aggregaattifunktiot arvioidaan ennen analyyttisiä funktioita, voidaan aggregaattifunktioita käyttää analyyttisten funktioiden syöttöoperandeina.
palauttaa
yhden tuloksen jokaiselle syötteen riville.
Ylilausekkeen määrittely
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
kuvaus
OVER
lauseke viittaa ikkunaan, joka määrittelee taulukon riviryhmän, jossa käytetään analyyttistä funktiota. Voit antaanamed_window
, joka on määritelty kyselyssäsi, tai voit määritellä uuden ikkunan TEKNISET TIEDOT.
huomautuksia
Jos nimettyä ikkuna-eikä ikkunamääritystä ei ole annettu, allinput-rivit sisällytetään ikkunaan jokaiselle riville.
esimerkit käyttäen OVER
lauseke
nämä kyselyt käyttävät ikkunamäärityksiä:
- laskee kokonaissumman
- laskee kumulatiivisen summan
- laskee liukuvan keskiarvon
- laskee kohteiden määrän vaihteluvälillä
- saa suosituimman kohteen kussakin kategoriassa
- saavat viimeisen arvon alueella
- lasketaan sijoitus
nämä kyselyt käyttävät nimettyä ikkunaa:
- Hanki viimeinen arvo alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
määrittelemällä ikkunan spesifikaatio
window_specification: ] ]
kuvaus
määrittelee ikkunan spesifikaatiot.
-
named_window
: olemassa olevan ikkunan nimi, joka oli määriteltyWINDOW
lausekkeella.
PARTITION BY
: hajottaa tulorivit erillisiksi osioiksi, joiden yli analyyttinen funktio arvioidaan itsenäisesti.
- Moniosoituslausekkeet sallitaan
PARTITION BY
lausekkeessa. - lauseke ei voi sisältää liukulukutyyppejä, ryhmittelemättömiä tyyppejä,vakioita tai analyyttisiä funktioita.
- Jos tätä valinnaista lauseketta ei käytetä, kaikki rivit syötettävässä pöytälaatikossa muodostavat yhden osion.
ORDER BY
: määrittelee, miten rivit järjestyvät osion sisällä.Tämä lauseke on valinnainen useimmissa tilanteissa, mutta sitä vaaditaan joissakin tapauksissa navigointitoimintoja varten.window_frame_clause
: Aggregaatti analyticfunctions, määrittelee ikkunan kehyksen nykyisen osion.Ikkunakehys määrittää, mitä ikkunaan sisällytetään.Jos tätä lauseketta käytetään, ORDER BY
vaaditaan lukuun ottamatta täysrajoitettuja ikkunoita.huomautuksia
Jos ORDER BY
lauseketta tai ikkunakehyslauseketta ei ole,ikkunakehys sisältää kaikki kyseisen osion rivit.
aggregoitujen analyyttisten funktioiden osalta, jos ORDER BY
lauseke on olemassa, mutta ikkunan kehyslauseke ei ole, oletuksena käytetään seuraavaa ikkunan kehyslauseketta:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
esimerkiksi seuraavat kyselyt vastaavat:
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
säännöt nimetyn ikkunan käyttämisestä ikkunamäärittelyssä
Jos käytät nimettyä ikkunaa ikkunamäärittelyissä, nämä säännöt pätevät:
- nimetyn ikkunan eritelmiä voidaan laajentaa uusilla eritelmillä, jotka määrittelet ikkunan määrittelylausekkeessa.
- ei voi olla turhia määritelmiä. Jos
ORDER BY
merkitään nimettyyn ikkunaan ja ikkunan erittelylausekkeeseen virhe. -
lausejärjestyksellä on väliä.
PARTITION BY
on tultava ensin,sittenORDER BY
jawindow_frame_clause
. Jos lisäät nimetty ikkuna, sen ikkunan TEKNISET käsitellään ensin.--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)
-
nimettyyn ikkunaan ei voi viitata
ORDER BY
lausekkeessa, ulommassa kyselyssä tai missään alaryhmässä.
nimetty ikkuna jaPARTITION BY
eivät voi esiintyä yhdessä ikkunan määrittelyssä. Jos tarvitset PARTITION BY
, lisää se nimettyyn ikkunaan.
esimerkit ikkunaspesifikaatiota käyttäen
nämä kyselyt määrittelevät osiot analyyttisessä funktiossa:
- laskee välisumman
- laske kumulatiivinen summa
- Hanki suosituin kohde kussakin kategoriassa
- saada viimeinen arvo alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
nämä kyselyt sisältävät nimetyn ikkunan ikkunan määrittelyssä:
- Hanki viimeinen arvo alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
nämä kyselyt määrittelevät, miten rivit on järjestetty osiossa:
- laske välisumma
- laske kumulatiivinen summa
- laske liukuva keskiarvo
- laske kohteiden lukumäärä vaihteluvälissä
- saa suosituin kohde kussakin luokassa
- saa viimeinen arvo alueella
- laske sijoitus
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
määrittelemässä ikkunakehystä lauseke
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
ikkunan Kehyslause määrittelee nykyisen rivin ympärillä olevan ikkunakehyksen, jonka yli analyyttinen funktio arvioidaan.Vain yhteenlasketut analyyttiset funktiot voivat käyttää ikkunan kehyslauseketta.
-
rows_range
: lauseke, joka määrittelee ikkunakehyksen fyysisellä rowsorilla tai loogisella vaihteluvälillä.-
ROWS
: laskee ikkunakehyksen nykyisen rivin fyysisten kompensaatioiden perusteella. Voit esimerkiksi sisällyttää kaksi riviä ennen ja jälkeen nykyisen rivin. -
RANGE
: laskee ikkunakehyksen nykyisen rivin ympärillä olevan loogisen rivin perusteella, joka perustuu nykyisen rivinORDER BY
avainarvoon.Annettu aluearvo lisätään tai vähennetään nykyisen rivin ’ skey-arvoon, jotta voidaan määritellä ikkunan kehyksen alku-tai loppualueen raja. Vaihteluvälipohjaisessa ikkunakehyksessäORDER BY
lausekkeessa on oltava täsmälleen yksi ekspressio, ja lausekkeella on oltava anumerinen tyyppi.
Vihje: Jos haluat käyttää aluetta, jolla on päivämäärä, käytä
ORDER BY
kanssaUNIX_DATE()
funktio. Jos haluat käyttää aluetta,jossa on aikaleima, käytäUNIX_SECONDS()
UNIX_MILLIS()
taiUNIX_MICROS()
funktiota. -
- Määrittele ikkunakehyksen alku siten, että
unbounded_preceding
numeric_preceding
numeric_following
, taicurrent_row
.-
unbounded_preceding
: ikkunakehys alkaa osituksen alusta. -
numeric_preceding
tainumeric_following
: ikkunakehyksen alku on suhteessa nykyiseen riviin. -
current_row
: ikkunan karmi alkaa nykyiseltä riviltä.
-
- Määrittele ikkunakehyksen loppu siten, että
numeric_preceding
numeric_following
current_row
, taiunbounded_following
.-
numeric_preceding
tainumeric_following
: ikkunakehyksen loppu on suhteessa nykyiseen riviin. -
current_row
: Ikkunan karmi päättyy nykyiseen riviin. -
unbounded_following
: ikkunankarmi päättyy partitionin loppuun.
-
-
unbounded_preceding
: ikkunankarmi alkaa partitionin alusta. -
numeric_preceding
: ikkunakehyksen alku on suhteessa nykyiseen riviin. -
current_row
: ikkunan karmi alkaa nykyiseltä riviltä.
frame_between
: luo ikkunakehyksen, jossa on ala-ja yläraja.Ensimmäinen raja edustaa alarajaa. Toinen raja edustaa ylärajaa. Vain tiettyjä rajayhdistelmiä voidaan käyttää, kuten edellisessä syntaksissa näkyy.
frame_start
: luo ikkunakehyksen, jossa on alaraja.Ikkunan karmi päättyy nykyiseen riviin.
numeric_expression
: lauseke, joka edustaa numeerista tyyppiä.Numeerisen lausekkeen on oltava vakio, ei-negatiivinen kokonaislukuparametri.
toteaa
Jos raja ulottuu osion alun tai lopun ulkopuolelle,ikkunakehys sisältää vain rivejä kyseisen osion sisältä.
ikkunakehyslauseketta ei voi käyttää avigaatio-ja numerofunktioiden kanssa,kuten RANK()
.
esimerkkejä käyttäen ikkunan kehyslauseketta
nämä kyselyt laskevat arvot ROWS
:
- laske kumulatiivinen summa
- laske liukuva keskiarvo
- Hanki suosituin kohde kussakin luokassa
- saada viimeinen arvo alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
nämä kyselyt laskevat arvot RANGE
:
- kohteiden lukumäärä alueella
nämä kyselyt laskevat arvot osittain tai täysin sitoutumattomalla ikkunalla:
- laskee kokonaissumman
- laskee kumulatiivisen summan
- saa kunkin kategorian suosituimman erän
- lasketaan sijoitus
nämä kyselyt laskevat arvot numeerisin rajauksin:
- laske kumulatiivinen summa
- laskee liukuvan keskiarvon
- alue
- Hanki viimeinen arvo alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
nämä kyselyt laskevat arvot nykyisen rivin ollessa rajana:
- laskee kokonaissumman
- laskee kumulatiivisen summan
viitaten nimettyyn ikkunaan
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 | ( ) }
nimetty ikkuna edustaa taulukon riviryhmää, jonka päällä käytetään ananalyyttistä funktiota. Nimetty ikkuna määritelläänWINDOW
lausekkeessa, ja siihen viitataan analyyttisen funktion OVER
clause.In OVER
lauseke, nimetty ikkuna voi näkyä joko itsestään tai upotettuna ikkunan määrittelyyn.
esimerkit
- saavat viimeisen arvon alueella
- käytä nimettyä ikkunaa ikkunan kehyslausekkeessa
Navigointifunktiokäsitteet
Navigointifunktiot laskevat yleensä jonkinvalue_expression
ikkunakehyksen eri rivillä kuin nykyinen rivi. OVER
lausekkeen syntaksi vaihtelee eri navigointifunktioissa.
OVER
lauseke:
-
PARTITION BY
: valinnainen. -
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
kaikkien suunnistustoimintojen tulosdatan tyyppi on sama kuinvalue_expression
.
Numerointifunktioiden käsitteet
Numerointifunktiot antavat kullekin riville kokonaislukuarvot sen mukaan, missä ne sijaitsevat määritellyssä ikkunassa.
Example of RANK()
DENSE_RANK()
, ja 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()
: X=5: n kohdallarank
on 4, silläRANK()
korotus edellisen ikkunan tilausryhmän vertaisten lukumäärän mukaan. -
DENSE_RANK()
: For x=5,dense_rank
on 3, koskaDENSE_RANK()
always increased by 1, koskaan ohita arvoa. -
ROW_NUMBER()
: For x=5,row_num
on 4.
Aggregaattifunktion käsitteet
aggregaattifunktio on funktio, joka suorittaa laskutoimituksen arvojen joukolla. Useimpia aggregaattifunktioita voidaan käyttää ananalyyttisessä funktiossa. Näitä yhteenlaskettuja funktioita kutsutaan analyyttisiksi funktioiksi.
aggregaattifunktioilla OVER
lauseke liitetään aggregaattifunktiokutsuun; funktiokutsun syntaksi pysyy muutoin muuttumattomana.Kuten niiden yhteenlasketun funktion kollegansa, nämä analyyttiset funktiot suorittavat erotuksia, mutta erityisesti kunkin rivin asiaankuuluvan ikkunan kehyksen yli.Näiden analyyttisten funktioiden tulosinformaatiotyypit ovat samat kuin theiraggregate-funktioiden vastineet.
analyyttiset funktioesimerkit
näissä esimerkeissä korostettu kohde on nykyinen rivi. Boldeditemit ovat rivejä, jotka sisältyvät analyysiin.
esimerkeissä käytetyt yleiset taulukot
seuraavissa aggregaattiesimerkeissä käytetään seuraavia taulukoita: Produce
Employees
ja Farm
.
Produce table
Some examples reference a table called 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 |+-------------------------------------+
työntekijöiden taulukko
Some examples reference a table called 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
Some examples reference a table called 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 |+-------------------------------------+
lasketaan kokonaissumma
Tämä laskee kokonaissumman kaikilleProduce
taulukon erille.
- (appelsiini, omena, purjo, kaali, lehtisalaatti, lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtikaali) lehtikaali) = 54 ostot yhteensä
- (appelsiini, omena, purjo, kaali, lehtisalaatti, lehtikaali)=54 ostot yhteensä
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 |+-------------------------------------------------------+
laskee välisumman
tämä laskee välisumman kullekin luokalle Produce
taulukko.
- hedelmä
- (appelsiini, omena) = 10 kokonaisostosta
- (appelsiini, omena) = 10 kokonaisostosta
- vihannes
- (purjo, kaali, lehtikaali) = 44 kokonaisostosta
- (purjo, kaali, lehtikaali) = 44 kokonaisostosta
- (purjo, kaali, lehtikaali) = 44 kokonaisostosta
- (purjo, kaali, lehtikaali) = 44 kokonaisostosta
- (purjo, kaali, lehtikaali)=44 kokonaisostosta
- (purjo, kaali, lehtisalaatti, lehtikaali)=44 kokonaisostosta
/li>
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 |+-------------------------------------------------------+
lasketaan kumulatiivinen summa
tämä laskee kumulatiivisen summan kullekin luokalle Produce
taulukossa. Summa lasketaan suhteessa theorder määriteltyyn ORDER BY
lauseketta käyttäen.
- hedelmä
- (appelsiini, omena) = 2 kokonaisostosta
- (appelsiini, omena) = 10 kokonaisostosta
- vihannes
- (purjo, kaali, lehtikaali) = 2 kokonaisostosta
- (purjo, kaali, lehtikaali) = 11 kokonaisostosta
- (purjo, kaali, lehtikaali) = 21 kokonaisostosta
- (purjo, kaali, lehtisalaatti, lehtikaali) = 44 kokonaisostosta
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 |+-------------------------------------------------------+
tämä tekee saman kuin edellinen esimerkki. CURRENT ROW
rajaksi ei tarvitse lisätä CURRENT ROW
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
tässä esimerkissä kaikki Produce
– taulukon erät sisältyvät osioon. Vain edeltävät rivit analysoidaan. Analyysi alkaa kaksiosaisena ennen osion nykyistä riviä.
- (appelsiini, purjo, omena, kaali, lehtisalaatti, lehtikaali) = NULL
- (appelsiini, purjo, omena, kaali, lehtikaali) = NULL
- (appelsiini, purjo, omena, kaali, lehtikaali) = 2
- (appelsiini, purjo, omena, kaali, lehtikaali) = 4
- (appelsiini, purjo, omena, kaali, lehtikaali) = 12
- (appelsiini, purjo, omena, kaali, lehtisalaatti, lehtikaali) = 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 |+-------------------------------------------------------+
lasketaan liukuva keskiarvo
tämä laskee liukuvan keskiarvon Produce
taulukossa.Alaraja on 1 rivi ennen nykyistä riviä. Yläraja on 1 rivi nykyisen rivin jälkeen.
- (appelsiini, purjo, omena, kaali, lehtisalaatti, lehtikaali) = 2 keskiostosta
- (appelsiini, purjo, omena, kaali, lehtikaali) = 4 keskiostosta
- (appelsiini, purjo, omena, kaali, lehtikaali) = 6.3333 keskiostosta
- (appelsiini, purjo, omena, kaali, lehtikaali) = 9 keskiostosta
- (appelsiini, purjo, omena, kaali, lehtikaali), lehtikaali) = 14 keskiostosta
- (appelsiini, purjo, omena, kaali, salaatti, lehtikaali) = 16.5 keskimääräiset ostot
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 |+-------------------------------------------------------+
lasketaan erien lukumäärä alueella
tällä esimerkillä saadaan Farm
taulukko.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 4 eläintä populaatioiden välillä 0-2.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 5 eläintä populaatioiden välillä 1-3.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 5 eläintä populaatioiden välillä 1-3.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 5 eläintä populaatioiden välillä 1-3.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 4 eläintä populaatioiden välillä 2-4.
- (hanhi, koira, härkä, vuohi, ankka, Kissa) = 1 eläin populaatioiden välillä 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 |+----------------------------------------------------------+
Get the most popular item in each category
This example gets the most popular item in each category. Se määrittelee, miten ikkunan rivit on jaettu ja järjestetty kussakin osiossa. Produce
taulukkoon viitataan.
- hedelmä
- (appelsiini, omena) = omena on suosituin
- (appelsiini, omena) = omena on suosituin
- vihannes
- (purjo, kaali, salaatti, lehtikaali) = lehtikaali on suosituin
- (purjo, kaali, salaatti, lehtikaali) = lehtikaali on suosituin
- (purjo, kaali, salaatti, lehtikaali) = lehtikaali on suosituin
- (purjo, kaali, salaatti, lehtikaali) = lehtikaali on suosituin
- (purjo, kaali, lehtikaali)=lehtikaali on suosituin
- (purjo, kaali, lehtisalaatti, lehtikaali)=lehtikaali on suosituinta
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 |+----------------------------------------------------+
saa viimeisen arvon alueella
Tämä esimerkki saa suosituimman kohteen tietyssä ikkunankarmissa, käyttäen Produce
Taulukko. Ikkunankarmissa analysoidaan jopa kolme palstaa kerrallaan. Katso tarkemminmost_popular
sarake vihanneksille.Sen sijaan saada suosituin kohde tietyn luokan, se saa themost suosittu kohde tietyn alueen kyseisessä luokassa.
- hedelmä
- (appelsiini, omena) = omena on suosituin
- (appelsiini, omena) = omena on suosituin
- vihannes
- (purjo, kaali, lehtisalaatti, lehtikaali) = kaali on suosituin
- (purjo, kaali, lehtikaali) = lehtisalaatti on suosituin
- (purjo, kaali, lehtikaali) = lehtisalaatti on suosituin
- (purjo, kaali, lehtikaali) = lehtikaali on suosituin
- (purjo, kaali, lehtikaali)=lehtikaali on suosituin
- (purjo, kaali, lehtisalaatti, lehtikaali)=lehtikaali on suosituin
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 |+----------------------------------------------------+
Tämä esimerkki palauttaa samat tulokset kuin edellinen esimerkki, mutta se sisältää nimetyn ikkunan nimeltä item_window
. Osa ikkunan spesifikaatioista on määritelty suoraan OVER
– lausekkeessa ja osa on määritelty nimetyssä ikkunassa.
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)
lasketaan sijoitus
tässä esimerkissä lasketaan kunkin työntekijän sijoitus osastollaan heidän aloituspäivänsä perusteella. Ikkunaspesifikaatio on määritelty suoraan OVER
lausekkeessa. Employees
taulukkoon viitataan.
- department 1
- (Jacob, Anthony, Andrew) = Assigny rank 1 Jacobille
- (Jacob, Anthony, Andrew) = Assigny rank 2 Anthonylle
- department 2
- (Isabella, Daniel, Jose) = Assigny rank 1 Isabellalle
- (Isabella, Daniel, Jose) = Assigny rank 2: lle Daniel
- (Isabella, Daniel, Jose) = anna sija 3 Joselle
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 |+--------------------------------------------+
käytä nimettyä ikkunaa ikkunan kehyslauseessa
voit määritellä osan logiikastasi nimettyyn ikkunaan ja osan siitä herätyksen kehyslauseke. Tämä logiikka on yhdistetty. Tässä on esimerkki, käyttäenProduce
– taulukkoa.
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 |+-------------------------------------------------------+
voit saada aikaisemmat tulokset myös näillä esimerkeillä:
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)
seuraava esimerkki tuottaa virheen, koska ikkunan kehyslauseke on määritelty kahdesti:
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