Funkcje okna mają zastosowanie do funkcji agregujących i rankingowych w określonym oknie (zestawie wierszy). Klauzula OVER jest używana z funkcjami okna w celu zdefiniowania tego okna. Klauzula OVER robi dwie rzeczy:
- Dzieli wiersze, tworząc zestaw wierszy. (Używana jest klauzula PARTITION BY)
- Porządkuje wiersze w tych partycjach w określonej kolejności. (Używana jest klauzula ORDER BY)
Notatka: Jeśli partycje nie są wykonane, ORDER BY porządkuje wszystkie wiersze tabeli.
spróbuj złapać w Javie
Składnia:
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>
Funkcja okna agregującego
Różne funkcje agregujące, takie jak SUM(), COUNT(), AVERAGE(), MAX() i MIN() zastosowane w konkretnym oknie (zestawie wierszy) nazywane są agregującymi funkcjami okna.
Rozważ następujące pracownik tabela :
| Nazwa | Wiek | Dział | Wynagrodzenie |
|---|---|---|---|
| Ramesz | 20 | Finanse | 50 000 |
| Głęboko | 25 | Obroty | 30 000 |
| Suresz | 22 | Finanse | 50000 |
| Baran | 28 | Finanse | 20 000 |
| Pradeepa | 22 | Obroty | 20 000 |
Przykład -
Znajdź średnie wynagrodzenie pracowników w każdym dziale i uporządkuj pracowników w dziale według wieku.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Daje to następujące wyniki:
| Nazwa | Wiek | Dział | Wynagrodzenie | Średnia_wynagrodzenie |
| Ramesz | 20 | Finanse | 50 000 | 40 000 |
| Suresz | 22 | Finanse | 50 000 | 40 000 |
| Baran | 28 | Finanse | 20 000 | 40 000 |
| Głęboko | 25 | Obroty | 30 000 | 25 000 |
| Pradeepa | 22 | Obroty | 20 000 | 25 000 |
Zwróć uwagę, że wszystkie średnie wynagrodzenia w danym oknie mają tę samą wartość.
Rozważmy inny przypadek:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Tutaj również porządkujemy rekordy w partycji według wartości wieku, a zatem średnie wartości zmieniają się zgodnie z posortowaną kolejnością.
Wynikiem powyższego zapytania będzie:
| Nazwa | Wiek | Dział | Wynagrodzenie | Średnia_wynagrodzenie |
|---|---|---|---|---|
| Ramesz | 20 | Finanse | 50 000 | 50 000 |
| Suresz | 22 | Finanse | 50 000 | 50 000 |
| Baran | 28 | Finanse | 20 000 | 40 000 |
| Pradeepa | 22 | Obroty | 20 000 | 20 000 |
| Głęboko | 25 | Obroty | 30 000 | 25 000 |
Dlatego powinniśmy zachować ostrożność podczas dodawania klauzul Order by do funkcji okna z agregatami.
Funkcje okna rankingowego:
Funkcje rankingowe to: RANK(), DENSE_RANK(), ROW_NUMBER()
- RANGA() -
Jak sama nazwa wskazuje, funkcja rangi przypisuje rangę wszystkim wierszom w każdej partycji. Ranga jest przypisywana w taki sposób, że ranga 1 jest nadawana pierwszemu wierszowi, a wierszom o tej samej wartości przypisuje się tę samą rangę. W przypadku następnej rangi po dwóch takich samych wartościach rangi, jedna wartość rangi zostanie pominięta. Na przykład, jeśli dwa wiersze mają tę samą rangę 1, następny wiersz otrzyma rangę 3, a nie 2.
- DENSE_RANK() –
Przypisuje rangę każdemu wierszowi w obrębie partycji. Podobnie jak funkcja rangi, pierwszy wiersz ma przypisaną rangę 1, a wiersze o tej samej wartości mają tę samą rangę. Różnica między RANK() i DENSE_RANK() polega na tym, że w przypadku DENSE_RANK() dla następnej rangi po dwóch takich samych rangach używana jest kolejna liczba całkowita, żadna ranga nie jest pomijana.
- NUMER WIERSZA() -
ROW_NUMBER() nadaje każdemu wierszowi unikalny numer. Numeruje wiersze od jednego do całkowitej liczby wierszy. Wiersze są grupowane w oparciu o ich wartości. Każda grupa nazywana jest partycją. W każdej partycji wiersze otrzymują numery jeden po drugim. Żadne dwa wiersze w partycji nie mają tego samego numeru. To sprawia, że ROW_NUMBER() różni się od RANK() i DENSE_RANK(). ROW_NUMBER() jednoznacznie identyfikuje każdy wiersz kolejną liczbą całkowitą. Pomaga to w różnego rodzaju analizach danych.
Notatka -
Podczas korzystania z funkcji okna rang należy obowiązkowo podać ORDER BY().
Przykład -
Oblicz numer wiersza, rangę, gęstą rangę pracowników w tabeli pracowników według wynagrodzenia w każdym dziale.
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;>
Wynikiem powyższego zapytania będzie:
| emp_row_no | Nazwa | Dział | Wynagrodzenie | em_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramesz | Finanse | 50 000 | 1 | 1 |
| 2 | Suresz | Finanse | 50 000 | 1 | 1 |
| 3 | Baran | Finanse | 20 000 | 3 | 2 |
| 1 | Głęboko | Obroty | 30 000 | 1 | 1 |
| 2 | Pradeepa | Obroty | 20 000 | 2 | 2 |
Widzimy zatem, że jak wspomniano w definicji ROW_NUMBER(), numery wierszy są kolejnymi liczbami całkowitymi w obrębie każdej partycji. Widzimy również różnicę między rangą a pozycją gęstą, że w gęstej randze nie ma luki między wartościami rang, podczas gdy istnieje luka w wartościach rang po wielokrotnej randze.
wiosenne st