Ответ вслух Senior Оконные функции обновлено

Рамка окна

Вопрос

Объясни, что такое рамка окна. Чем ROWS отличается от RANGE и где на этом ошибаются?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Рамка определяет, какие строки раздела функция видит, когда считает значение для текущей строки. Если в OVER нет ORDER BY, рамка это весь раздел.

Что должно прозвучать в ответе

  • Рамка задаёт, какие строки раздела видит функция для текущей строки

  • Без ORDER BY рамка это весь раздел, с ORDER BY по умолчанию RANGE от начала до текущей строки с её peers

  • ROWS считает физические строки, RANGE логические значения ключа сортировки

  • При дублях ключа нарастающий итог через RANGE даёт одинаковые значения

  • LAST_VALUE и NTH_VALUE с рамкой по умолчанию работают неожиданно

  • Для скользящих окон по времени: RANGE BETWEEN INTERVAL ... PRECEDING

Что могут спросить следом

  • Как посчитать сумму за последние 7 дней, если в данных есть пропуски дней?
  • Что такое GROUPS в рамке?

Разбор

Рамка определяет, какие строки раздела функция видит, когда считает значение для текущей строки. Если в OVER нет ORDER BY, рамка это весь раздел. Если ORDER BY есть, по умолчанию действует RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, то есть от начала раздела до текущей строки, причём RANGE включает и все строки с тем же значением ключа сортировки. Отсюда две классические ошибки. Первая: нарастающий итог при повторяющихся датах даёт одинаковые числа у всех строк одной даты; если нужен построчный, пишу ROWS. Вторая: LAST_VALUE возвращает текущую строку, потому что рамка на ней кончается; нужна рамка до UNBOUNDED FOLLOWING. ROWS считает физические строки, это удобно для «трёх предыдущих записей». RANGE работает со значениями: RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW честно возьмёт неделю, даже если какие-то дни пропущены.

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

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

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