middle
Как работают оконные функции (window functions)?
Оконные функции выполняют вычисления над набором строк, связанных с текущей строкой, без группировки — в отличие от GROUP BY строки не схлопываются. Это мощный инструмент для аналитических запросов.
Синтаксис
Пример
функция() OVER (
[PARTITION BY столбец1, столбец2, ...] -- разбивка на группы (окна)
[ORDER BY столбец3 [ASC|DESC], ...] -- сортировка внутри окна
[ROWS|RANGE BETWEEN ... AND ...] -- рамка окна
)
Пример: нумерация и нарастающий итог
Пример
SELECT
id, account_id, amount, created_at,
ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY created_at) AS tx_number,
SUM(amount) OVER (PARTITION BY account_id ORDER BY created_at) AS running_total,
SUM(amount) OVER (PARTITION BY account_id) AS account_total
FROM transactions;
Рамка окна (frame)
Пример
-- Скользящее среднее за 3 записи
AVG(amount) OVER (
ORDER BY created_at
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS moving_avg
При наличии ORDER BY рамка по умолчанию: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (нарастающий итог).
Именованное окно (WINDOW)
Пример
SELECT
id, amount,
ROW_NUMBER() OVER w AS rn,
SUM(amount) OVER w AS running_total,
AVG(amount) OVER w AS running_avg
FROM transactions
WINDOW w AS (PARTITION BY account_id ORDER BY created_at);
На собеседовании: главное отличие от GROUP BY — строки не схлопываются. PARTITION BY разбивает данные на окна (как GROUP BY), но каждая строка остаётся в результате. Упомяните именованное окно (WINDOW) — это показывает умение писать чистый SQL.