logo

Funkcje okna w SQL

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