Ikkunafunktioiden Tyypit
Tarkastellaan lyhyesti tärkeimpiä SQL:ssä käytettäviä ikkunafunktioiden tyyppejä.
Aggregaattifunktiot
Nämä ovat tavanomaisia aggregaattifunktioita (AVG
, SUM
, MAX
, MIN
, COUNT
), joita käytetään ikkunakontekstissa. Olemme jo käyttäneet tämän tyyppistä ikkunafunktiota edellisessä luvussa.
Järjestysfunktiot
Järjestysfunktiot SQL:ssä ovat ikkunafunktioita, joiden avulla voidaan antaa järjestysluku jokaiselle riville tulosjoukon osiossa. Näistä funktioista on paljon hyötyä järjestettyjen laskentojen ja analyysien tekemisessä.
-
RANK()
: Antaa yksilöllisen järjestysluvun jokaiselle erilaiselle riville osiossaORDER BY
-ehdon perusteella. Samat arvot saavat saman järjestysluvun, ja järjestysluvuissa voi olla aukkoja; -
DENSE_RANK()
: Kuten RANK(), mutta ilman aukkoja järjestysluvuissa; -
NTILE(n)
: Jakaa järjestetyn osion rivitn
ryhmään ja antaa jokaiselle riville ryhmänumeron.
Esimerkki
Järjestämme myynnit Amount
-kentän perusteella kullekin ProductID
:lle nousevassa järjestyksessä käyttäen DENSE_RANK()
-funktiota:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Tulostaulu sisältää kaikki tiedot päätaulusta sekä lisäsarakkeen, joka näyttää kunkin myynnin järjestyksen kyseiselle tuotteelle.
Arvovertailufunktiot
Arvovertailuikkunafunktioita SQL:ssä käytetään vertailemaan nykyisen rivin arvoja muiden rivien arvoihin saman osion sisällä.
Nämä funktiot ovat erityisen hyödyllisiä trendejä analysoitaessa, laskelmissa vierekkäisten rivien perusteella tai tiettyjen riviarvojen hakemisessa määritellystä ikkunasta.
SQL:ssä on useita arvovertailufunktioita:
LAG()
: Hakee arvon edellisestä rivistä tulosjoukossa ilman tarvetta itseyhdistelyyn;LEAD()
: Hakee arvon seuraavasta rivistä tulosjoukossa ilman tarvetta itseyhdistelyyn;FIRST_VALUE()
: Palauttaa ensimmäisen rivin arvon ikkunakehyksessä;LAST_VALUE()
: Palauttaa viimeisen rivin arvon ikkunakehyksessä.
Esimerkki
Käytetään LAG()
-arvovertailuikkunafunktiota myyntimäärän muutoksen laskemiseen edelliseen myyntiin verrattuna jokaiselle tuotteelle:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Tämän ansiosta voimme helposti hakea tietoa myyntierojen kehityksestä jokaiselle tuotteelle ilman alikyselyitä tai tallennettuja proseduureja.
Voimme myös laskea erotukset kaikille myynneille ilman ositusta seuraavalla kyselyllä:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Voit huomata, että emme sisällyttäneet PARTITION BY
-lausetta OVER
-lohkoon. Tämä tarkoittaa, että emme halua hakea edellisiä arvoja vain tietylle tuotteelle, vaan kaikille myynneille taulussa.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain the difference between RANK() and DENSE_RANK() in more detail?
What are some practical use cases for value comparison window functions like LAG() and LEAD()?
Could you provide more examples of window functions in SQL?
Awesome!
Completion rate improved to 4.35
Ikkunafunktioiden Tyypit
Pyyhkäise näyttääksesi valikon
Tarkastellaan lyhyesti tärkeimpiä SQL:ssä käytettäviä ikkunafunktioiden tyyppejä.
Aggregaattifunktiot
Nämä ovat tavanomaisia aggregaattifunktioita (AVG
, SUM
, MAX
, MIN
, COUNT
), joita käytetään ikkunakontekstissa. Olemme jo käyttäneet tämän tyyppistä ikkunafunktiota edellisessä luvussa.
Järjestysfunktiot
Järjestysfunktiot SQL:ssä ovat ikkunafunktioita, joiden avulla voidaan antaa järjestysluku jokaiselle riville tulosjoukon osiossa. Näistä funktioista on paljon hyötyä järjestettyjen laskentojen ja analyysien tekemisessä.
-
RANK()
: Antaa yksilöllisen järjestysluvun jokaiselle erilaiselle riville osiossaORDER BY
-ehdon perusteella. Samat arvot saavat saman järjestysluvun, ja järjestysluvuissa voi olla aukkoja; -
DENSE_RANK()
: Kuten RANK(), mutta ilman aukkoja järjestysluvuissa; -
NTILE(n)
: Jakaa järjestetyn osion rivitn
ryhmään ja antaa jokaiselle riville ryhmänumeron.
Esimerkki
Järjestämme myynnit Amount
-kentän perusteella kullekin ProductID
:lle nousevassa järjestyksessä käyttäen DENSE_RANK()
-funktiota:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Tulostaulu sisältää kaikki tiedot päätaulusta sekä lisäsarakkeen, joka näyttää kunkin myynnin järjestyksen kyseiselle tuotteelle.
Arvovertailufunktiot
Arvovertailuikkunafunktioita SQL:ssä käytetään vertailemaan nykyisen rivin arvoja muiden rivien arvoihin saman osion sisällä.
Nämä funktiot ovat erityisen hyödyllisiä trendejä analysoitaessa, laskelmissa vierekkäisten rivien perusteella tai tiettyjen riviarvojen hakemisessa määritellystä ikkunasta.
SQL:ssä on useita arvovertailufunktioita:
LAG()
: Hakee arvon edellisestä rivistä tulosjoukossa ilman tarvetta itseyhdistelyyn;LEAD()
: Hakee arvon seuraavasta rivistä tulosjoukossa ilman tarvetta itseyhdistelyyn;FIRST_VALUE()
: Palauttaa ensimmäisen rivin arvon ikkunakehyksessä;LAST_VALUE()
: Palauttaa viimeisen rivin arvon ikkunakehyksessä.
Esimerkki
Käytetään LAG()
-arvovertailuikkunafunktiota myyntimäärän muutoksen laskemiseen edelliseen myyntiin verrattuna jokaiselle tuotteelle:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Tämän ansiosta voimme helposti hakea tietoa myyntierojen kehityksestä jokaiselle tuotteelle ilman alikyselyitä tai tallennettuja proseduureja.
Voimme myös laskea erotukset kaikille myynneille ilman ositusta seuraavalla kyselyllä:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Voit huomata, että emme sisällyttäneet PARTITION BY
-lausetta OVER
-lohkoon. Tämä tarkoittaa, että emme halua hakea edellisiä arvoja vain tietylle tuotteelle, vaan kaikille myynneille taulussa.
Kiitos palautteestasi!