Выбор ответа Middle SQL дата-инженера обновлено
Ловушка LAST_VALUE
Вопрос
Запрос LAST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts) должен вернуть финальный статус заказа на каждой строке, но возвращает статус текущей строки. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Рамка по умолчанию кончается на текущей строке; нужна ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. «Последняя» строка рамки при рамке по умолчанию это текущая строка (или последняя из равных ей по ts).
Варианты ответа
- Рамка по умолчанию кончается на текущей строке; нужна
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGправильный ответ LAST_VALUEне работает с текстовыми колонками и возвращает значение текущей строки как есть- Нужно убрать
PARTITION BY: с ним окно состоит из одной строки, и последней всегда будет текущая - Нужно отсортировать по убыванию
tsи применитьLAST_VALUEещё раз поверх первого, тогда вернётся финальный статус
Разбор
«Последняя» строка рамки при рамке по умолчанию это текущая строка (или последняя из равных ей по ts). Явная рамка до конца раздела исправляет это. Альтернатива: FIRST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts DESC). Тип данных значения не имеет. Без PARTITION BY статусы разных заказов смешаются. Повторный LAST_VALUE с другой сортировкой ту же проблему не решает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.