Типи Віконних Функцій
Свайпніть щоб показати меню
Розглянемо коротко основні типи віконних функцій, які використовуються в 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(): отримує значення з попереднього рядка у результаті без необхідності самоз'єднання;LEAD(): отримує значення з наступного рядка у результаті без необхідності самоз'єднання;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;
У результаті можна легко отримати інформацію про різницю в продажах для кожного окремого продукту без використання підзапитів або збережених процедур.
Також можна обчислити різницю для всіх продажів без розбиття на групи, використовуючи наступний запит:
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. Це означає, що ми не хочемо отримувати попередні значення лише для певного продукту, а для всіх продажів у таблиці.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат