Типи Віконних Функцій
Свайпніть щоб показати меню
Розглянемо коротко основні типи віконних функцій, які використовуються в SQL.
Агрегатні функції
Це стандартні агрегатні функції (AVG, SUM, MAX, MIN, COUNT), які застосовуються у віконному контексті. Ми вже використовували цей тип віконних функцій у попередньому розділі.
Ранжувальні функції
Ранжувальні функції в SQL — це тип віконних функцій, які дозволяють призначати ранг кожному рядку у межах розділу результату. Ці функції надзвичайно корисні для виконання впорядкованих обчислень та аналізу.
-
RANK(): призначає унікальний ранг кожному унікальному рядку в межах розділу на основі оператораORDER BY. Рядки з однаковими значеннями отримують однаковий ранг, при цьому у ранжуванні залишаються пропуски; -
DENSE_RANK(): подібна до RANK(), але без пропусків у послідовності рангів; -
NTILE(n): ділить рядки у впорядкованому розділі наnгруп і призначає кожному рядку номер групи.
Приклад
Визначимо ранг продажів за Amount для кожного ProductID у зростаючому порядку, використовуючи функцію DENSE_RANK():
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Результуюча таблиця містить усю інформацію з основної таблиці та додатковий стовпець, який вказує ранг кожного продажу для конкретного продукту.
Функції порівняння значень
Віконні функції порівняння значень у SQL використовуються для порівняння значень у поточному рядку зі значеннями в інших рядках у межах одного розділу.
Ці функції особливо корисні для аналізу тенденцій, виконання обчислень на основі сусідніх рядків або доступу до певних значень рядків у визначеному вікні.
У SQL існує кілька функцій порівняння значень:
LAG(): отримує значення з попереднього рядка у результаті без необхідності використання self-join;LEAD(): отримує значення з наступного рядка у результаті без необхідності використання self-join;FIRST_VALUE(): повертає значення першого рядка у віконній рамці;LAST_VALUE(): повертає значення останнього рядка у віконній рамці.
Приклад
Використаємо віконну функцію порівняння значень LAG() для обчислення зміни суми продажу порівняно з попереднім продажем для кожного продукту:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Основні частини запиту:
- Клаузула
SELECT: Визначає стовпці, які потрібно отримати з таблиці.- Назви стовпців: Містить такі стовпці, як
SalesID,ProductID,SalesDateтаAmountдля відображення відповідних даних по кожному продажу. - Віконна функція: Використовує функцію
LAG()для отримання значення попереднього рядка для певного стовпця в межах розділу. Додатковий обчислюваний стовпець показує різницю між поточним і попереднім значенням.
- Назви стовпців: Містить такі стовпці, як
Синтаксис віконної функції:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Стовпець, з якого отримується попереднє значення.offset: Кількість рядків назад від поточного рядка для отримання значення (за замовчуванням 1).default_value: Значення, яке повертається, якщо offset виходить за межі розділу (необов'язково).PARTITION BY partition_column: Ділить результуючу вибірку на розділи, до яких застосовується віконна функція, забезпечуючи окрему роботу функції в кожному розділі.ORDER BY order_column: Визначає порядок рядків у кожному розділі, щоб функція обробляла рядки у відповідній послідовності.
У результаті можна легко отримати інформацію про різницю продажів для кожного окремого продукту без використання підзапитів або збережених процедур.
Також можна обчислити різницю для всіх продажів без розділення на групи, використовуючи наступний запит:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Ви можете побачити, що ми не включили оператор PARTITION BY у блок OVER. Це означає, що ми не хочемо отримувати попередні значення лише для певного продукту, а для всіх продажів у таблиці.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат