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