Logu funkcijas attiecas uz apkopošanas un ranžēšanas funkcijām noteiktā logā (rindu kopa). OVER klauzula tiek izmantota ar loga funkcijām, lai definētu šo logu. OVER klauzula veic divas lietas:
- Sadala rindas, lai izveidotu rindu kopu. (tiek izmantota klauzula PARTITION BY)
- Sakārto rindas šajos nodalījumos noteiktā secībā. (tiek izmantots punkts ORDER BY)
Piezīme: Ja nodalījumi nav pabeigti, ORDER BY sakārto visas tabulas rindas.
Sintakse:
daļēja atkarība
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>
Apkopotā loga funkcija
Dažādas apkopojošas funkcijas, piemēram, SUM(), COUNT(), VIDĒJAIS(), MAX() un MIN(), kas tiek lietotas konkrētam logam (rindu kopai), tiek sauktas par apkopojošām loga funkcijām.
Apsveriet tālāk minēto darbinieks tabula :
| Vārds | Vecums | nodaļa | Alga |
|---|---|---|---|
| Ramešs | divdesmit | Finanses | 50 000 |
| Dziļi | 25 | Pārdošana | 30 000 |
| Suresh | 22 | Finanses | 50 000 |
| Ram | 28 | Finanses | 20 000 |
| Pradīpa | 22 | Pārdošana | 20 000 |
Piemērs -
Atrodiet vidējo darbinieku algu katrā nodaļā un pasūtiet darbiniekus nodaļā pēc vecuma.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Tas izvada sekojošo:
| Vārds | Vecums | nodaļa | Alga | Vidējā_alga |
| Ramešs | divdesmit | Finanses | 50 000 | 40 000 |
| Suresh | 22 | Finanses | 50 000 | 40 000 |
| Ram | 28 | Finanses | 20 000 | 40 000 |
| Dziļi | 25 | Pārdošana | 30 000 | 25 000 |
| Pradīpa | 22 | Pārdošana | 20 000 | 25 000 |
Ievērojiet, kā visām vidējām algām noteiktā logā ir vienāda vērtība.
Apskatīsim citu gadījumu:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Šeit mēs arī sakārtojam ierakstus nodalījumā atbilstoši vecuma vērtībām, un tādējādi vidējās vērtības mainās atbilstoši sakārtotajai secībai.
Iepriekš minētā vaicājuma izvade būs:
| Vārds | Vecums | nodaļa | Alga | Vidējā_alga |
|---|---|---|---|---|
| Ramešs | divdesmit | Finanses | 50 000 | 50 000 |
| Suresh | 22 | Finanses | 50 000 | 50 000 |
| Ram | 28 | Finanses | 20 000 | 40 000 |
| Pradīpa | 22 | Pārdošana | 20 000 | 20 000 |
| Dziļi | 25 | Pārdošana | 30 000 | 25 000 |
Tāpēc mums jābūt uzmanīgiem, pievienojot secību pēc klauzulām logu funkcijām ar agregātiem.
Sakārtošanas loga funkcijas:
Ranžēšanas funkcijas ir: RANK(), DENSE_RANK(), ROW_NUMBER()
- RANK() –
Kā norāda nosaukums, ranga funkcija piešķir rangu visām rindām katrā nodalījumā. Rangs tiek piešķirts tā, ka pirmajai rindai piešķirtais rangs 1 un rindām ar vienādu vērtību tiek piešķirts tāds pats rangs. Nākamajam rangam pēc divām vienādām ranga vērtībām viena ranga vērtība tiks izlaista. Piemēram, ja divām rindām ir 1. rangs, nākamajai rindai tiek piešķirts 3. rangs, nevis 2.
- DENSE_RANK() —
Tas piešķir rangu katrai nodalījuma rindai. Tāpat kā ranga funkcijai, pirmajai rindai tiek piešķirts rangs 1, un rindām ar vienādu vērtību ir vienāds rangs. Atšķirība starp RANK() un DENSE_RANK() ir tāda, ka DENSE_RANK() nākamajam rangam pēc diviem vienādiem rangiem tiek izmantots secīgs vesels skaitlis, neviens rangs netiek izlaists.
- ROW_NUMBER()–
ROW_NUMBER() piešķir katrai rindai unikālu numuru. Tas numurē rindas no vienas līdz kopējai rindai. Rindas tiek sadalītas grupās, pamatojoties uz to vērtībām. Katru grupu sauc par nodalījumu. Katrā nodalījumā rindas iegūst skaitļus viena pēc otras. Sadaļā nav divu rindu ar vienādu numuru. Tādējādi ROW_NUMBER() atšķiras no RANK() un DENSE_RANK(). ROW_NUMBER() unikāli identificē katru rindu ar veselu skaitli. Tas palīdz dažāda veida datu analīzē.
Piezīme -
ORDER BY() obligāti jānorāda, izmantojot rangu loga funkcijas.
Piemērs -
Aprēķināt rindas nr., rangu, darbinieku blīvo rangu ir darbinieku tabula pēc algas katrā nodaļā.
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;>
Iepriekš minētā vaicājuma izvade būs:
| emp_row_no | Vārds | nodaļa | Alga | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramešs | Finanses | 50 000 | 1 | 1 |
| 2 | Suresh | Finanses | 50 000 | 1 | 1 |
| 3 | Ram | Finanses | 20 000 | 3 | 2 |
| 1 | Dziļi | Pārdošana | 30 000 | 1 | 1 |
| 2 | Pradīpa | Pārdošana | 20 000 | 2 | 2 |
Tātad, mēs varam redzēt, ka, kā minēts ROW_NUMBER() definīcijā, rindu numuri ir secīgi veseli skaitļi katrā nodalījumā. Tāpat mēs redzam atšķirību starp rangu un blīvo rangu, ka blīvā rangā starp ranga vērtībām nav atstarpes, savukārt pēc atkārtotas ranga ir atšķirības rangu vērtībās.