Выбор ответа Middle Оконные функции спрашивают часто обновлено

Оконная функция в WHERE

Вопрос

Что произойдёт с запросом?

SELECT name, department_id, salary
FROM employees
WHERE ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) <= 2;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ошибка: оконные функции нельзя использовать в WHERE. Оконные функции вычисляются на шаге SELECT, после WHERE, GROUP BY и HAVING, поэтому PostgreSQL отклонит запрос («window functions are not allowed in WHERE»).

Варианты ответа

  1. Вернутся по два сотрудника с самой высокой зарплатой в каждом отделе
  2. Ошибка: оконные функции нельзя использовать в WHEREправильный ответ
  3. Вернутся два сотрудника с самой высокой зарплатой во всей компании
  4. Условие будет проигнорировано

Разбор

Оконные функции вычисляются на шаге SELECT, после WHERE, GROUP BY и HAVING, поэтому PostgreSQL отклонит запрос («window functions are not allowed in WHERE»). Правильно: посчитать ROW_NUMBER в подзапросе или CTE и фильтровать снаружи. Условие не игнорируется: запрос просто не выполнится.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме