Первый заказ пользователя через 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 отфильтрованы вместе со своими пользователями
- Ошибку: фильтровать по результату оконной функции нельзя даже во внешнем запросе над подзапросом
