Выбор ответа Senior Оконные функции обновлено
Ловушка LAST_VALUE
Вопрос
Хотели в каждой строке отдела получить зарплату самого низкооплачиваемого сотрудника. Что вернёт запрос (зарплаты в отделе разные)?
SELECT name, salary,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS lowest
FROM employees;
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Зарплату текущей строки. С ORDER BY рамка по умолчанию заканчивается на текущей строке (точнее, на последней строке с тем же значением сортировки).
Варианты ответа
- Зарплату текущей строкиправильный ответ
- Минимальную зарплату отдела
- Максимальную зарплату отдела
- NULL
Разбор
С ORDER BY рамка по умолчанию заканчивается на текущей строке (точнее, на последней строке с тем же значением сортировки). Значит, «последняя строка рамки» это сама текущая строка, и LAST_VALUE вернёт её зарплату. Нужна рамка до конца окна: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, или проще MIN(salary) OVER (PARTITION BY department_id).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Оконные функции»
- Через сколько дней второй заказ
- Какие дубли удалить, оставив свежую запись
- Самый высоко- и низкооплачиваемый в отделе
- Самая длинная серия дней подряд
- Рост выручки к прошлому месяцу
- Скользящее среднее выручки за 3 дня
- Длинные перерывы между оплатами
- Разбиение кликов на сессии