Рамки: ROWS и RANGE
Выбирайте между рамками ROWS BETWEEN и RANGE BETWEEN и разбирайтесь, как каждая из них обрабатывает дубликаты и пропуски
«Рамки: ROWS и RANGE» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Рамка внутри OVER
Оконная функция вычисляется в пределах рамки — подмножества строк раздела. Рамка задаётся с помощью:
OVER (
PARTITION BY ...
ORDER BY ...
ROWS BETWEEN <start> AND <end> -- or RANGE BETWEEN ...
)Рамка по умолчанию
Если указать ORDER BY, но не задать рамку, по умолчанию используется:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
-- "From the first row up to all rows tied with the current row".ROWS считает физические строки
ROWS считает N строк в порядке раздела независимо от их значений:
SUM(x) OVER (ORDER BY day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
-- The current row plus the previous 2. Exactly 3 rows.RANGE считает по значениям
RANGE считает строки, значение ORDER BY которых попадает в интервал относительно текущего значения:
SUM(x) OVER (
ORDER BY day
RANGE BETWEEN INTERVAL '2 days' PRECEDING AND CURRENT ROW
)
-- All rows within 2 days (by calendar) of the current row.Почему это различие важно
Если в данных есть пропуски, ROWS и RANGE дают разные результаты:
-- Days: 1, 3, 5 (no 2 or 4)
-- ROWS BETWEEN 2 PRECEDING AND CURRENT ROW for day 5: rows 1,3,5 = 3 days
-- RANGE BETWEEN INTERVAL '2 days' PRECEDING for day 5: only days 3,5 = 2 daysРамка GROUPS (PG 11+)
GROUPS считает группы равных значений (совпадения в ORDER BY), а не отдельные строки:
SUM(x) OVER (
ORDER BY tier
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
)
-- "The current tier and the previous tier" — useful when ORDER BY has many ties.Границы рамки
UNBOUNDED PRECEDING— первая строка разделаn PRECEDINGCURRENT ROWn FOLLOWINGUNBOUNDED FOLLOWING— последняя строка
Накопительный итог
Сумма от начала до текущей строки:
SUM(x) OVER (ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-- Same as the default frame.Скользящее окно назад
Скользящее среднее за последние N дней:
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS avg_7dЦентрированное окно
Посмотрите в обе стороны:
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centred_7dНеожиданное поведение LAST_VALUE
LAST_VALUE с рамкой по умолчанию возвращает текущую строку, а не последнюю строку раздела. Используйте явную рамку с неограниченными границами:
LAST_VALUE(name) OVER (
PARTITION BY group ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)Предложение EXCLUDE (PG 11+)
Пропускайте определённые строки в рамке:
SUM(x) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
EXCLUDE CURRENT ROW
)
-- All previous 6 days but not today.Итоги
Предложения для рамки дают точный контроль над окнами.
- ROWS — количество физических строк
- RANGE — интервал на основе значений
- GROUPS — группы равных значений
- Рамка по умолчанию может привести к неожиданностям — задавайте её явно
Быстрая проверка
У вас есть ежедневная выручка с пропущенными днями. Какая рамка задаёт «все строки за 7 календарных дней до текущего момента»?
Часто задаваемые вопросы
Урок «Рамки: ROWS и RANGE» бесплатный?
Да — полный текст урока «Рамки: ROWS и RANGE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Рамки: ROWS и RANGE»?
Выбирайте между рамками ROWS BETWEEN и RANGE BETWEEN и разбирайтесь, как каждая из них обрабатывает дубликаты и пропуски Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Рамки: ROWS и RANGE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Рамки: ROWS и RANGE
- LAG и LEAD с оконными рамками
- Разбиение на группы с NTILE и Cume_Dist
- Шаблоны отчётности из реальной практики