Як працюють віконні функції в SQL і в яких сценаріях їх вигідніше використовувати?
Віконні функції виконують обчислення на наборі рядків таблиці, які тим чи іншим чином пов'язані з поточним рядком. На відміну від групування за допомогою GROUP BY, віконні функції не зводять множину рядків до одного агрегованого запису, а зберігають вихідні деталі кожного рядка, додаючи до них результати обчислень. Це робить їх незамінними для аналітичних запитів, розрахунків ковзних середніх, ранжування та накопичених підсумків.
Синтаксис віконних функцій включає ключове слово OVER, всередині якого задаються підрозділи за допомогою трьох основних компонентів:
Класичним прикладом ефективного використання віконних функцій є задача пошуку топ-N записів у кожній категорії, наприклад, трьох найдорожчих товарів у кожній товарній групі. Замість складних підзапитів з операторами JOIN та обмеженнями можна застосувати функцію ROW_NUMBER або DENSE_RANK з поділом за категоріями та сортуванням за ціною. База даних обробляє такі запити значно швидше, оскільки оптимізатор може побудувати ефективніший план виконання.
Також віконні функції є незамінними при аналізі часових рядів, коли потрібно обчислити різницю між поточним і попереднім значенням метрики за допомогою функції LAG або LEAD. Використання цих механізмів позбавляє розробника необхідності писати громіздкі циклічні скрипти на боці додатку, перекладаючи всю тяжкість обчислень на оптимізований рушій СУБД.