Вступить в клуб →
средняявопросSQL и витрины данных

Первый заказ пользователя через ROW_NUMBER и одинаковые метки времени

Витрина первых заказов собирается так:

SELECT user_id, order_id, amount, created_at
FROM (
  SELECT user_id, order_id, amount, created_at,
         ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) AS rn
  FROM orders
) t
WHERE rn = 1;

Что вернёт запрос и какой краевой случай делает результат нестабильным между пересборками витрины?

  • Первый заказ каждого пользователя; при одинаковом created_at обе строки получат номер 1 и попадут в результат, поэтому строк в витрине окажется больше, чем пользователей, а сумма первых заказов будет завышена
  • По одной строке на пользователя — его самый ранний заказ; если у пользователя два заказа с одинаковым created_at, выбор между ними произволен, поэтому в ORDER BY нужен тай-брейкер, например order_id
  • Только заказы пользователей, у которых ровно один заказ: строки с rn > 1 отфильтрованы вместе со своими пользователями
  • Ошибку: фильтровать по результату оконной функции нельзя даже во внешнем запросе над подзапросом

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела