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.