Vinduesfunktioner gælder for aggregerede og rangordnede funktioner over et bestemt vindue (sæt af rækker). OVER-klausul bruges sammen med vinduesfunktioner til at definere dette vindue. OVER-klausulen gør to ting:
- Opdeler rækker for at danne et sæt rækker. (PARTITION BY-klausulen bruges)
- Ordrer rækker inden for disse partitioner i en bestemt rækkefølge. (ORDER BY klausul bruges)
Bemærk: Hvis partitioner ikke er færdige, bestiller ORDER BY alle rækker i tabellen.
Syntaks:
global var i js
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>
Samlet vinduesfunktion
Forskellige aggregerede funktioner såsom SUM(), COUNT(), AVERAGE(), MAX() og MIN() anvendt over et bestemt vindue (sæt af rækker) kaldes aggregerede vinduesfunktioner.
Overvej følgende medarbejder bord :
| Navn | Alder | Afdeling | Løn |
|---|---|---|---|
| Ramesh | tyve | Finansiere | 50.000 |
| Dyb | 25 | Salg | 30.000 |
| Suresh | 22 | Finansiere | 50.000 |
| Vædder | 28 | Finansiere | 20.000 |
| Pradeep | 22 | Salg | 20.000 |
Eksempel –
Find den gennemsnitlige løn for medarbejdere for hver afdeling og bestil medarbejdere inden for en afdeling efter alder.
hvornår kom vinde 7 ud
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Dette udsender følgende:
| Navn | Alder | Afdeling | Løn | Gns_Løn |
| Ramesh | tyve | Finansiere | 50.000 | 40.000 |
| Suresh | 22 | Finansiere | 50.000 | 40.000 |
| Vædder | 28 | Finansiere | 20.000 | 40.000 |
| Dyb | 25 | Salg | 30.000 | 25.000 |
| Pradeep | 22 | Salg | 20.000 | 25.000 |
Læg mærke til, hvordan alle gennemsnitslønninger i et bestemt vindue har samme værdi.
Lad os overveje en anden sag:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Her bestiller vi også posterne i partitionen efter aldersværdier, og derfor ændres gennemsnitsværdierne i den sorterede rækkefølge.
Outputtet af ovenstående forespørgsel vil være:
| Navn | Alder | Afdeling | Løn | Gns_Løn |
|---|---|---|---|---|
| Ramesh | tyve | Finansiere | 50.000 | 50.000 |
| Suresh | 22 | Finansiere | 50.000 | 50.000 |
| Vædder | 28 | Finansiere | 20.000 | 40.000 |
| Pradeep | 22 | Salg | 20.000 | 20.000 |
| Dyb | 25 | Salg | 30.000 | 25.000 |
Derfor bør vi være forsigtige, når vi tilføjer orden efter klausuler til vinduesfunktioner med aggregater.
Placering af vinduesfunktioner:
Rangeringsfunktioner er RANK(), DENSE_RANK(), ROW_NUMBER()
- RANK() –
Som navnet antyder, tildeler rangfunktionen rang til alle rækkerne i hver partition. Rangering tildeles således, at rang 1 givet til den første række og rækker med samme værdi tildeles samme rang. For den næste rangering efter to samme rangværdier vil en rangværdi blive sprunget over. For eksempel, hvis to rækker deler rang 1, får den næste række rang 3, ikke 2.
- DENSE_RANK() –
Den tildeler rang til hver række i partitionen. Ligesom rangfunktion er første række tildelt rang 1, og rækker med samme værdi har samme rang. Forskellen mellem RANK() og DENSE_RANK() er, at i DENSE_RANK(), for den næste rangering efter to samme rang, bruges et fortløbende heltal, ingen rang springes over.
- ROW_NUMBER() –
ROW_NUMBER() giver hver række et unikt nummer. Det nummererer rækker fra én til det samlede antal rækker. Rækkerne inddeles i grupper ud fra deres værdier. Hver gruppe kaldes en partition. I hver partition får rækker tal efter hinanden. Ikke to rækker har det samme nummer i en partition. Dette gør ROW_NUMBER() forskellig fra RANK() og DENSE_RANK(). ROW_NUMBER() identificerer entydigt hver række med et sekventielt heltal. Dette hjælper med forskellige former for dataanalyse.
Bemærk -
ORDER BY() skal angives obligatorisk, mens du bruger rangeringsvinduefunktioner.
Eksempel –
Beregn rækkenr., rang, tætte rang af medarbejdere er medarbejdertabel efter løn inden for hver afdeling.
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;>
Outputtet af ovenstående forespørgsel vil være:
tcp vs udp
| emp_row_no | Navn | Afdeling | Løn | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramesh | Finansiere | 50.000 | 1 | 1 |
| 2 | Suresh | Finansiere | 50.000 | 1 | 1 |
| 3 | Vædder | Finansiere | 20.000 | 3 | 2 |
| 1 | Dyb | Salg | 30.000 | 1 | 1 |
| 2 | Pradeep | Salg | 20.000 | 2 | 2 |
Så vi kan se, at som nævnt i definitionen af ROW_NUMBER() er rækkenumrene fortløbende heltal inden for hver partition. Vi kan også se forskel mellem rang og tæt rang, at der i tæt rang ikke er nogen afstand mellem rangværdier, mens der er gab i rangværdier efter gentagen rang.