logo

Ikkunatoiminnot SQL:ssä

Ikkunafunktiot koskevat koonti- ja sijoitusfunktioita tietyssä ikkunassa (rivijoukossa). OVER-lausetta käytetään ikkunatoimintojen kanssa määrittämään kyseinen ikkuna. OVER-lause tekee kaksi asiaa:

  • Osiot rivit muodostaaksesi rivijoukon. (PARTITION BY -lausetta käytetään)
  • Järjestää näiden osioiden rivit tiettyyn järjestykseen. (ORDER BY -lausetta käytetään)

Huomautus: Jos osioita ei ole tehty, ORDER BY järjestää kaikki taulukon rivit.



Syntaksi:

SELECT coulmn_name1,   window_function(cloumn_name2)  OVER([PARTITION BY column_name1] [ORDER BY column_name3]) AS new_column FROM table_name;       window_function=   any aggregate or ranking function    column_name1  = column to be selected   coulmn_name2=   column on which window function is to be applied   column_name3  = column on whose basis partition of rows is to be done   new_column=   Name of new column   table_name=   Name of table>

Aggregate Window Function
Erilaisia ​​aggregaattifunktioita, kuten SUMMA(), COUNT(), AVERAGE(), MAX() ja MIN(), joita käytetään tietyssä ikkunassa (rivijoukossa), kutsutaan kokoomaikkunafunktioiksi.

Harkitse seuraavaa työntekijä pöytä :



Nimi Ikä osasto Palkka
Ramesh kaksikymmentä Rahoittaa 50 000
Syvä 25 Myynti 30 000
Suresh 22 Rahoittaa 50 000
RAM 28 Rahoittaa 20 000
Pradeep 22 Myynti 20 000

Esimerkki -
Selvitä kunkin osaston työntekijöiden keskipalkka ja järjestele työntekijät osaston sisällä iän mukaan.

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

Tämä tulostaa seuraavat:

Nimi Ikä osasto Palkka Keskipalkka
Ramesh kaksikymmentä Rahoittaa 50 000 40 000
Suresh 22 Rahoittaa 50 000 40 000
RAM 28 Rahoittaa 20 000 40 000
Syvä 25 Myynti 30 000 25 000
Pradeep 22 Myynti 20 000 25 000

Huomaa, kuinka kaikilla tietyn ikkunan keskipalkoilla on sama arvo.



Tarkastellaanpa toista tapausta:

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary  FROM employee>

Täällä myös järjestämme tietueet osion sisällä ikäarvojen mukaan ja siten keskiarvot muuttuvat lajiteltujen sääntöjen mukaan.
Yllä olevan kyselyn tulos on:

Nimi Ikä osasto Palkka Keskipalkka
Ramesh kaksikymmentä Rahoittaa 50 000 50 000
Suresh 22 Rahoittaa 50 000 50 000
RAM 28 Rahoittaa 20 000 40 000
Pradeep 22 Myynti 20 000 20 000
Syvä 25 Myynti 30 000 25 000

Siksi meidän tulee olla varovaisia, kun lisäämme järjestystä lauseiden mukaan aggregaatteja sisältäviin ikkunafunktioihin.

Ranking-ikkunan toiminnot:
Sijoitusfunktiot ovat RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANK() –
    Kuten nimestä voi päätellä, rank-funktio antaa sijoituksen jokaiselle osion kaikille riveille. Sijoitus asetetaan siten, että ensimmäiselle riville annettu sijoitus 1 ja saman arvon omaaville riveille annetaan sama arvo. Kahden saman arvoarvon jälkeen seuraavalla arvolla yksi arvo ohitetaan. Jos esimerkiksi kahdella rivillä on arvo 1, seuraava rivi saa sijan 3, ei 2.
  • DENSE_RANK() –
    Se määrittää sijoituksen jokaiselle osion riville. Aivan kuten rank-funktion ensimmäiselle riville on annettu sijoitus 1 ja riveillä, joilla on sama arvo, on sama arvo. Ero RANK():n ja DENSE_RANK():n välillä on se, että arvossa DENSE_RANK() kahden saman arvon jälkeiselle seuraavalle arvolle käytetään peräkkäistä kokonaislukua, eikä mitään arvoa ohiteta.
  • ROW_NUMBER() –
    ROW_NUMBER() antaa jokaiselle riville yksilöllisen numeron. Se numeroi rivit yhdestä rivien kokonaismäärään. Rivit on jaettu ryhmiin niiden arvojen perusteella. Jokaista ryhmää kutsutaan osioksi. Jokaisessa osiossa rivit saavat numerot peräkkäin. Osiossa ei ole kahdella rivillä samaa numeroa. Tämä tekee ROW_NUMBER() erilaisen arvoista RANK() ja DENSE_RANK(). ROW_NUMBER() tunnistaa yksilöllisesti jokaisen rivin peräkkäisellä kokonaisluvulla. Tämä auttaa erilaisissa data-analyyseissä.

Huomautus -
ORDER BY() tulee määrittää pakollisesti, kun käytetään rank-ikkunafunktioita.

Esimerkki -
Laske rivinro, sijoitus, työntekijöiden tiheys on työntekijätaulukko kunkin osaston palkan mukaan.

SELECT   ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS emp_row_no,   Name,   Department,   Salary,  RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_rank,  DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_dense_rank FROM   employee;>

Yllä olevan kyselyn tulos on:

emp_row_no Nimi osasto Palkka emp_rank emp_dense_rank
1 Ramesh Rahoittaa 50 000 1 1
2 Suresh Rahoittaa 50 000 1 1
3 RAM Rahoittaa 20 000 3 2
1 Syvä Myynti 30 000 1 1
2 Pradeep Myynti 20 000 2 2

Joten voimme nähdä, että kuten ROW_NUMBER() määritelmässä mainittiin, rivinumerot ovat peräkkäisiä kokonaislukuja kussakin osiossa. Voimme myös nähdä eron arvon ja tiheän arvon välillä, että tiheässä arvossa ei ole aukkoa sijoitusarvojen välillä, kun taas toistuvan arvon jälkeen on eroa.

linux komennot