Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Типи Віконних Функцій | Деякі Додаткові Теми
Quizzes & Challenges
Quizzes
Challenges
/
Оптимізація 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

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

Suggested prompts:

Can you explain the difference between RANK() and DENSE_RANK() in more detail?

What are some practical use cases for value comparison window functions like LAG() and LEAD()?

Could you provide more examples of window functions in 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
some-alt