logo

Vinduesfunktioner i SQL

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.