Агрегатні функції можуть виступати як функції вікна.

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

Визначення

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

Функції вікна працюють з “вікном” або підмножиною рядків і повертають значення для кожного рядка, базуючись на обчисленнях в межах вікна.

Агрегатна функція зменшує кількість рядків через групування, а функція вікна зберігає всі початкові рядки.

Приклад

Розглянемо наступну таблицю продажів,

| Продукт | Продажі |  
|:-------:|:------:|  
| Ноутбук | 5000 |  
| Ноутбук | 7000 |  
| Телефон | 3000 |  
| Телефон | 4000 |

Приклад агрегатної функції,

SELECT  
 Продукт,  
 SUM(Продажі) AS ЗагальніПродажі  
FROM продажі  
GROUP BY Продукт;

Функція SUM агрегує рядки в один результат для кожного Продукту.

| Продукт | ЗагальніПродажі |  
|:-------:|:--------------:|  
| Ноутбук | 12000 |  
| Телефон | 7000 |

Приклад функції вікна,

SELECT  
 Продукт,  
 Продажі,  
 SUM(Продажі) OVER (PARTITION BY Продукт) AS ЗагальніПродажі  
FROM продажі;

Функція SUM тут працює як функція вікна завдяки оператору OVER(), зберігаючи всі рядки і обчислюючи загальні значення в межах заданого "вікна" PARTITION BY Продукт.

pic

Так, агрегатні функції можуть виступати як функції вікна. Вони використовуються з оператором OVER(). Це дозволяє агрегатним функціям обчислювати значення для конкретного "вікна" або підмножини рядків, зберігаючи всі рядки у результаті.

За лаштунками

Коли агрегатна функція використовується як функція вікна (з оператором OVER()), база даних виконує кілька кроків за лаштунками для обчислення результату.

SELECT   
 Продукт,   
 Продажі,   
 SUM(Продажі) OVER (PARTITION BY Продукт) AS ЗагальніПродажі  
FROM продажі;

Крок 1: Розділити набір даних за Продуктом

  • Розділ 1: рядки Ноутбук
  • Розділ 2: рядки Телефон

Крок 2: Для кожного рядка обчислити SUM(Продажі) для його розділу

  • Розділ 1: 5000 + 7000 = 12000
  • Розділ 2: 3000 + 4000 = 7000

Крок 3: Призначити результат кожному рядку в межах його розділу

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

Порівняння з регулярними агрегатними функціями

Для звичайних агрегатних функцій немає розділів або кадрів. Функція працює з усім набором даних або згрупованими підмножинами (визначеними через GROUP BY).

Кількість вихідних рядків зменшується, оскільки результати повертаються на кожну групу.

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

Що таке швидкість?

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

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

Агрегатні функції (наприклад, SUM, AVG, COUNT, MAX, MIN) призначені для підсумовування даних шляхом об’єднання рядків в менший набір результатів.

Функції вікна (наприклад, SUM() OVER(), ROW_NUMBER() OVER()) зберігають усі рядки в результаті, обчислюючи певне "вікно" рядків.

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

Перекладено з: Aggregate functions can act as window functions.

Leave a Reply

Your email address will not be published. Required fields are marked *