Вы хотите добавить колонку «номер покупки пользователя за всю историю» через ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_at), но в том же запросе ограничиваете данные WHERE order_at >= '2025-12-01'. Какой эффект это окажет на нумерацию?

AНумерация будет считаться по всей истории заказов пользователя независимо от условия WHERE по дате order_at
BЗапрос завершится с ошибкой: оконные функции ROW_NUMBER запрещено комбинировать с условием WHERE в одном уровне
CНумерация посчитается только по отфильтрованным строкам; для номера по всей истории ROW_NUMBER считают в подзапросе или CTE
DДостаточно заменить ROW_NUMBER на DENSE_RANK, и нумерация автоматически станет «по всей истории» c учётом всех заказов
Правильный ответ. Оконные функции считаются после WHERE, поэтому фильтр меняет набор строк, по которым работает окно.

Разбор

В логическом порядке выполнения SQL сначала применяются FROM и WHERE, и только потом вычисляются выражения SELECT, включая оконные функции. Поэтому WHERE order_at >= '2025-12-01' отбрасывает более ранние покупки, и ROW_NUMBER() начинает нумерацию заново на оставшемся наборе. Если нужен номер покупки по всей истории, посчитайте ROW_NUMBER() в подзапросе или CTE без фильтра, а внешний запрос уже фильтруйте по дате. Замена на DENSE_RANK логику не меняет, и оконные функции вполне совместимы с WHERE.

Проверь себя · 1/3разбор после ответа
Вы пишете LAG(price) OVER (PARTITION BY product_id), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?
Тренировать SQL в Telegram

Ещё вопросы по теме «Оконные функции»