Віконна функція рахує значення по набору рядків («вікну»), але, на відміну від GROUP BY, не схлопує рядки: кожен рядок лишається у результаті й отримує свою цифру.
SELECT
created_at::date AS day,
total,
SUM(total) OVER (ORDER BY created_at) AS running_total,
RANK() OVER (ORDER BY total DESC) AS place,
total - LAG(total) OVER (ORDER BY created_at) AS diff_from_previous
FROM orders;
Основні функції:
ROW_NUMBER()- порядковий номер без повторів.RANK()- однакові значення ділять місце, далі пропуск (1, 2, 2, 4).DENSE_RANK()- без пропусків (1, 2, 2, 3).LAG()/LEAD()- значення з попереднього чи наступного рядка.- Будь-який агрегат (
SUM,AVG,COUNT) зOVER.
PARTITION BY ділить вікно на групи - наприклад, рейтинг усередині кожної категорії: RANK() OVER (PARTITION BY category_id ORDER BY sales DESC).
Рамка вікна - пастка для старших: з ORDER BY агрегат за замовчуванням рахує від початку до поточного рядка з урахуванням рівних значень (RANGE). Рядки з однаковим created_at отримають однаковий накопичений підсумок. Для «рядок за рядком» потрібно явно: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Так само рахують і ковзне середнє: AVG(total) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW).