Gymterview
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.