Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы потом найти 1-й, 2-й, 3-й заказ. Какое выражение подходит?

AROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_at)
BROW_NUMBER() OVER (ORDER BY order_at)
CRANK() OVER (PARTITION BY user_id ORDER BY order_at)
DSUM(order_id) OVER (PARTITION BY user_id ORDER BY order_at)
Правильный ответ. PARTITION BY сбрасывает счетчик для каждого пользователя, а ORDER BY задает порядок нумерации.

Разбор

ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_at) считает порядковый номер строки внутри каждого user_id, упорядочивая заказы по order_at. Без PARTITION BY номера будут общими на весь датасет. RANK() и DENSE_RANK() полезны для мест/тайов, но для «какая по счету покупка» обычно нужен именно ROW_NUMBER().

Проверь себя · 1/3разбор после ответа
Вы написали SUM(amount) OVER (ORDER BY paid_at) и ожидали накопительную сумму по каждому пользователю, но сумма растет сквозь всех пользователей. Что нужно добавить в OVER, чтобы накопление считалось отдельно по каждому пользователю?
Тренировать SQL в Telegram

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