Выбор ответа Senior Оконные функции обновлено

Ловушка LAST_VALUE

Вопрос

Хотели в каждой строке отдела получить зарплату самого низкооплачиваемого сотрудника. Что вернёт запрос (зарплаты в отделе разные)?

SELECT name, salary,
       LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS lowest
FROM employees;

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

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

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

Коротко

Правильный ответ: Зарплату текущей строки. С ORDER BY рамка по умолчанию заканчивается на текущей строке (точнее, на последней строке с тем же значением сортировки).

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

  1. Зарплату текущей строкиправильный ответ
  2. Минимальную зарплату отдела
  3. Максимальную зарплату отдела
  4. NULL

Разбор

С ORDER BY рамка по умолчанию заканчивается на текущей строке (точнее, на последней строке с тем же значением сортировки). Значит, «последняя строка рамки» это сама текущая строка, и LAST_VALUE вернёт её зарплату. Нужна рамка до конца окна: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, или проще MIN(salary) OVER (PARTITION BY department_id).

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

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

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