logo

Vindufunksjoner i SQL

Vindufunksjoner gjelder for aggregering og rangering av funksjoner over et bestemt vindu (sett med rader). OVER-klausul brukes med vindusfunksjoner for å definere det vinduet. OVER-klausulen gjør to ting:

  • Partisjoner rader for å danne et sett med rader. (PARTITION BY-klausulen brukes)
  • Ordrer rader innenfor disse partisjonene i en bestemt rekkefølge. (ORDER BY klausul brukes)

Merk: Hvis partisjoner ikke er ferdige, bestiller ORDER BY alle rader i tabellen.

Syntaks:



concat strenger java
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>

Aggregert vindufunksjon
Ulike aggregatfunksjoner som SUM(), COUNT(), AVERAGE(), MAX() og MIN() brukt over et bestemt vindu (sett med rader) kalles aggregatvindusfunksjoner.

Vurder følgende ansatt tabell:

Navn Alder Avdeling Lønn
Ramesh tjue Finansiere 50 000
Dyp 25 Salg 30 000
Suresh 22 Finansiere 50 000
RAM 28 Finansiere 20 000
Pradeep 22 Salg 20 000

Eksempel –
Finn gjennomsnittlig lønn til ansatte for hver avdeling og bestill ansatte innenfor en avdeling etter alder.

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

Dette gir ut følgende:

Navn Alder Avdeling Lønn Gj.sn._lønn
Ramesh tjue Finansiere 50 000 40 000
Suresh 22 Finansiere 50 000 40 000
RAM 28 Finansiere 20 000 40 000
Dyp 25 Salg 30 000 25 000
Pradeep 22 Salg 20 000 25 000

Legg merke til hvordan alle gjennomsnittslønningene i et bestemt vindu har samme verdi.

La oss vurdere en annen sak:

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

Her bestiller vi også postene innenfor partisjonen i henhold til aldersverdier, og dermed endres gjennomsnittsverdiene i henhold til den sorterte rekkefølgen.
Utdata fra spørringen ovenfor vil være:

Navn Alder Avdeling Lønn Gj.sn._lønn
Ramesh tjue Finansiere 50 000 50 000
Suresh 22 Finansiere 50 000 50 000
RAM 28 Finansiere 20 000 40 000
Pradeep 22 Salg 20 000 20 000
Dyp 25 Salg 30 000 25 000

Derfor bør vi være forsiktige når vi legger til orden etter klausuler til vindusfunksjoner med aggregater.

Rangeringsvindusfunksjoner:
Rangeringsfunksjoner er RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANK() –
    Som navnet antyder, tildeler rangfunksjonen rangering til alle radene i hver partisjon. Rangering tildeles slik at rang 1 gitt til den første raden og rader med samme verdi tildeles samme rangering. For neste rangering etter to samme rangeringsverdier, vil en rangeringsverdi hoppes over. For eksempel, hvis to rader deler rangering 1, får neste rad rangering 3, ikke 2.
  • DENSE_RANK() –
    Den tildeler rang til hver rad i partisjonen. Akkurat som rangeringsfunksjonen er første rad tildelt rang 1 og rader med samme verdi har samme rangering. Forskjellen mellom RANK() og DENSE_RANK() er at i DENSE_RANK(), for neste rangering etter to samme rangering, brukes påfølgende heltall, ingen rangering hoppes over.
  • ROW_NUMBER() –
    ROW_NUMBER() gir hver rad et unikt nummer. Den nummererer rader fra én til totalt rader. Radene settes inn i grupper basert på deres verdier. Hver gruppe kalles en partisjon. I hver partisjon får rader tall etter hverandre. Ingen to rader har samme nummer i en partisjon. Dette gjør ROW_NUMBER() forskjellig fra RANK() og DENSE_RANK(). ROW_NUMBER() identifiserer hver rad unikt med et sekvensielt heltall. Dette hjelper med ulike typer dataanalyse.

Merk -
ORDER BY() bør spesifiseres obligatorisk ved bruk av rangeringsvindusfunksjoner.

Eksempel –
Beregn radnr., rangering, tett rangering av ansatte er ansatttabell i henhold til lønn innenfor hver avdeling.

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;>

Utdata fra spørringen ovenfor vil være:

c++ prototypefunksjon
emp_row_no Navn Avdeling Lønn emp_rank emp_dense_rank
1 Ramesh Finansiere 50 000 1 1
2 Suresh Finansiere 50 000 1 1
3 RAM Finansiere 20 000 3 2
1 Dyp Salg 30 000 1 1
2 Pradeep Salg 20 000 2 2

Så vi kan se at som nevnt i definisjonen av ROW_NUMBER() er radnumrene påfølgende heltall innenfor hver partisjon. Vi kan også se forskjell mellom rangering og tett rangering at i tett rangering er det ikke noe gap mellom rangeringsverdier mens det er gap i rangeringsverdier etter gjentatt rangering.