Вы хотите добавить колонку «номер покупки пользователя за всю историю» через ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_at), но в том же запросе ограничиваете данные WHERE order_at >= '2025-12-01'. Какой эффект это окажет на нумерацию?
AНумерация будет по всей истории, фильтр
WHERE на нее не влияетBЗапрос не выполнится: оконные функции нельзя использовать вместе с
WHERECНумерация будет считаться только внутри отфильтрованных строк; для «за всю историю» нужно сначала посчитать
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?Ещё вопросы по теме «Оконные функции»
- В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем `RANK() OVER (ORDER BY revenue DESC)`. Какие ранги будут у строк, если упорядочить товары по убыванию выручки?
- Вы ищете последнюю транзакцию пользователя, используя `ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY paid_at DESC)` и оставляя `row_number = 1`. Что верно, если у пользователя две транзакции с одинаковым `paid_at`?
- Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
- В каждой категории нужно выбрать товары с тремя наибольшими различными значениями `revenue`, включая все товары, которые делят эти значения (при равных значениях). Какой вариант даст нужный результат?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы потом найти 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →