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

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

Разбор

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

Проверь себя · 1/3разбор после ответа
Вы хотите сравнить текущую метрику с метрикой следующего периода во временном ряду. Какая функция возвращает «следующее» значение относительно текущей строки по порядку ORDER BY?
Тренировать SQL в Telegram

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