logo

Віконні функції в SQL

Віконні функції застосовуються до агрегатних функцій і функцій ранжирування в певному вікні (набір рядків). Речення OVER використовується з віконними функціями для визначення цього вікна. Речення OVER робить дві речі:

  • Розділяє рядки, щоб сформувати набір рядків. (використовується речення PARTITION BY)
  • Упорядковує рядки в цих розділах у певному порядку. (використовується речення ORDER BY)

Примітка: Якщо розділи не виконано, тоді ORDER BY упорядковує всі рядки таблиці.



Синтаксис:

змінна глобальний javascript
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>

Функція агрегатного вікна
Різноманітні агрегатні функції, такі як SUM(), COUNT(), AVERAGE(), MAX() і MIN(), застосовані до певного вікна (набору рядків), називаються агрегатними віконними функціями.

Розглянемо наступне працівник стіл:



Ім'я Вік відділ Зарплата
Рамеш двадцять Фінанси 50 000
Глибокий 25 Продажі 30 000
Суреш 22 Фінанси 50000
ОЗП 28 Фінанси 20 000
Прадіп 22 Продажі 20 000

приклад –
Знайдіть середню заробітну плату співробітників для кожного відділу та впорядкуйте працівників у відділі за віком.

що таке hashset java
SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

Це виводить наступне:

Ім'я Вік відділ Зарплата Середня_зарплата
Рамеш двадцять Фінанси 50 000 40 000
Суреш 22 Фінанси 50 000 40 000
ОЗП 28 Фінанси 20 000 40 000
Глибокий 25 Продажі 30 000 25 000
Прадіп 22 Продажі 20 000 25 000

Зверніть увагу, що всі середні зарплати в певному вікні мають однакове значення.



Розглянемо інший випадок:

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

Тут ми також упорядковуємо записи в розділі відповідно до вікових значень, і, отже, середні значення змінюються відповідно до відсортованого порядку.
Результатом запиту буде:

Ім'я Вік відділ Зарплата Середня_зарплата
Рамеш двадцять Фінанси 50 000 50 000
Суреш 22 Фінанси 50 000 50 000
ОЗП 28 Фінанси 20 000 40 000
Прадіп 22 Продажі 20 000 20 000
Глибокий 25 Продажі 30 000 25 000

Отже, ми повинні бути обережними, додаючи пропозиції порядку до віконних функцій з агрегатами.

Функції вікна рейтингу:
Функції ранжирування: RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANK() –
    Як випливає з назви, функція rank призначає ранг усім рядкам у кожному розділі. Ранг призначається таким чином, що ранг 1 надається першому рядку, а рядки з однаковим значенням отримують однаковий ранг. Для наступного рангу після двох однакових значень рангу одне значення рангу буде пропущено. Наприклад, якщо два рядки мають спільний ранг 1, наступний рядок отримує ранг 3, а не 2.
  • DENSE_RANK() –
    Він призначає ранг кожному рядку в розділі. Подібно до функції рангування, першому рядку присвоюється ранг 1, а рядки з однаковим значенням мають однаковий ранг. Різниця між RANK() і DENSE_RANK() полягає в тому, що в DENSE_RANK() для наступного рангу після двох однакових рангів використовується послідовне ціле число, жоден ранг не пропускається.
  • ROW_NUMBER() –
    ROW_NUMBER() надає кожному рядку унікальний номер. Він нумерує рядки від одиниці до загальної кількості рядків. Рядки об’єднуються в групи на основі їх значень. Кожна група називається розділом. У кожному розділі рядки отримують номери один за одним. Немає двох рядків з однаковими номерами в розділі. Це робить ROW_NUMBER() відмінним від RANK() і DENSE_RANK(). ROW_NUMBER() унікально визначає кожен рядок послідовним цілим числом. Це допомагає з різними видами аналізу даних.

Примітка -
ORDER BY() слід вказувати обов’язково при використанні функцій рангового вікна.

приклад –
Розрахувати номер рядка, ранг, щільний ряд співробітників - таблицю співробітників відповідно до зарплати в кожному відділі.

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

Результатом запиту буде:

atoi c
emp_row_no Ім'я відділ Зарплата emp_rank emp_dense_rank
1 Рамеш Фінанси 50 000 1 1
2 Суреш Фінанси 50 000 1 1
3 ОЗП Фінанси 20 000 3 2
1 Глибокий Продажі 30 000 1 1
2 Прадіп Продажі 20 000 2 2

Отже, ми бачимо, що, як зазначено у визначенні ROW_NUMBER(), номери рядків є послідовними цілими числами в кожному розділі. Крім того, ми бачимо різницю між рангом і щільним рангом, що в щільному рангу немає розриву між значеннями рангу, тоді як є розрив у значеннях рангу після повторного рангу.