Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Типи Віконних Функцій | Деякі Додаткові Теми
Оптимізація SQL та Особливості Запитів

bookТипи Віконних Функцій

Свайпніть щоб показати меню

Розглянемо коротко основні типи віконних функцій, які використовуються в SQL.

Агрегатні функції

Це стандартні агрегатні функції (AVG, SUM, MAX, MIN, COUNT), які застосовуються у віконному контексті. Цей тип віконних функцій вже використовувався у попередньому розділі.

Функції ранжування

Функції ранжування в SQL — це тип віконних функцій, які дозволяють призначати ранг кожному рядку у межах розділу результату. Такі функції є надзвичайно корисними для впорядкованих обчислень та аналізу.

  • RANK(): призначає унікальний ранг кожному унікальному рядку у межах розділу на основі оператора ORDER BY. Рядки з однаковими значеннями отримують однаковий ранг, при цьому у ранжуванні залишаються пропуски;

  • DENSE_RANK(): подібна до RANK(), але без пропусків у послідовності рангів;

  • NTILE(n): ділить рядки у впорядкованому розділі на n груп і призначає кожному рядку номер групи.

Приклад

Визначимо ранг продажів за Amount для кожного ProductID у порядку зростання, використовуючи функцію DENSE_RANK():

12345678
SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
copy

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

Функції порівняння значень

Віконні функції порівняння значень у SQL використовуються для порівняння значень у поточному рядку зі значеннями в інших рядках у межах одного розділу.
Ці функції особливо корисні для аналізу тенденцій, виконання обчислень на основі сусідніх рядків або доступу до конкретних значень рядків у визначеному вікні. У SQL існує декілька функцій порівняння значень:

  • LAG(): отримує значення з попереднього рядка у результаті без необхідності самоз'єднання;
  • LEAD(): отримує значення з наступного рядка у результаті без необхідності самоз'єднання;
  • FIRST_VALUE(): повертає значення першого рядка у віконній рамці;
  • LAST_VALUE(): повертає значення останнього рядка у віконній рамці.

Приклад

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

1234567891011
SELECT 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;
copy

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

123456789
SELECT 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;
copy

Ви можете побачити, що ми не включили оператор PARTITION BY у блок OVER. Це означає, що ми не хочемо отримувати попередні значення лише для певного продукту, а для всіх продажів у таблиці.

question mark

Що робить функція NTILE() у SQL?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 3
some-alt