Вы хотите добавить колонку «номер покупки пользователя за всю историю» через ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_at), но в том же запросе ограничиваете данные WHERE order_at >= '2025-12-01'. Какой эффект это окажет на нумерацию?
AНумерация будет считаться по всей истории заказов пользователя независимо от условия
WHERE по дате order_atBЗапрос завершится с ошибкой: оконные функции
ROW_NUMBER запрещено комбинировать с условием WHERE в одном уровнеCНумерация посчитается только по отфильтрованным строкам; для номера по всей истории
ROW_NUMBER считают в подзапросе или CTEDДостаточно заменить
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), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?Ещё вопросы по теме «Оконные функции»
- В одной категории 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-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →