Собесов

Какие утверждения об оконных функциях F(...) OVER(...) верны?

SQLОконные функцииЛёгкаяJunior

Условие

Выберите верные утверждения об оконных функциях вида F(...) OVER(...):

  • A) Агрегирующая оконная функция сокращает количество строк в результате запроса.
  • B) В скобках после OVER может быть пусто.
  • C) Можно использовать агрегатные функции внутри оконных функций.
  • D) Оконная функция не может участвовать в условии в WHERE.

Задание засчитывается, если все варианты выбраны правильно.

Решение

Верны: B, C, D.

  • A — неверно. Оконная функция отличается от обычной агрегации именно тем, что не схлопывает строки. SUM(x) OVER (...) оставляет столько же строк, сколько было в источнике.
  • B — верно. OVER () без PARTITION BY и ORDER BY означает «окно — все строки результата». Например: SUM(amount) OVER () — общая сумма, повторённая в каждой строке.
  • C — верно. Внутри F(...) оконной функции можно поместить агрегат (SUM, AVG, COUNT и т.д.). Тогда сначала выполнится агрегация (если есть GROUP BY), а потом окно поверх агрегированного результата. Без GROUP BY это просто оконная агрегация.
  • D — верно. Оконные функции вычисляются после WHERE (на этапе SELECT). Поэтому в WHERE они недоступны — нужно обернуть запрос в подзапрос/CTE и фильтровать на внешнем уровне.

Порядок выполнения

FROM → WHERE → GROUP BY → HAVING → SELECT (включая оконные) → ORDER BY → LIMIT

Поэтому, например, WHERE ROW_NUMBER() OVER (...) = 1 не сработает.

Подводные камни

  1. Считать, что SUM(x) OVER () = SUM(x) после GROUP BY. Без GROUP BY оконная функция повторит общую сумму в каждой строке, а обычный агрегат вернёт одну строку.
  2. Использовать оконку в WHERE. Только в подзапросе или через CTE: SELECT * FROM (SELECT x, ROW_NUMBER() OVER (ORDER BY ts) rn FROM t) WHERE rn = 1.
  3. Забывать про ORDER BY в окне. Для SUM(x) OVER (ORDER BY ts) это бегущий итог; без ORDER BY — общая сумма.

Эталонный ответ

B, C, D.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти