Последний заказ на клиента: RANK при одинаковых датах
Для витрины нужна ровно одна строка на клиента — его самый свежий заказ. У части клиентов два заказа имеют одинаковый created_at (оформлены пакетом).
SELECT *
FROM (
SELECT o.*,
RANK() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders o
) t
WHERE rn = 1;
Что получится?
- У клиентов с одинаковым created_at вернётся несколько строк — здесь нужен ROW_NUMBER
- Ровно по одной строке на клиента: RANK и ROW_NUMBER в такой конструкции дают одинаковую нумерацию
- Клиенты с ничьёй выпадут из результата: RANK присвоит им значение 2
- Ошибку: фильтр по оконной функции нужно писать в HAVING, а не в WHERE подзапроса
