0Pricing
SQL Academy · Урок

Рамки: 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 PRECEDING
  • CURRENT ROW
  • n FOLLOWING
  • UNBOUNDED 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 — локальная установка не требуется.

Все уроки этого курса

  1. Рамки: ROWS и RANGE
  2. LAG и LEAD с оконными рамками
  3. Разбиение на группы с NTILE и Cume_Dist
  4. Шаблоны отчётности из реальной практики
← Назад к SQL Academy