Нужно получить последнюю операцию каждого пользователя? В PostgreSQL можно не ранжировать всю таблицу через
ROW_NUMBER().
SELECT
u.id,
last_order.id,
last_order.created_at
FROM users AS u
LEFT JOIN LATERAL (
SELECT id, created_at
FROM orders
WHERE user_id = u.id
ORDER BY created_at DESC
LIMIT 1
) AS last_order ON true;
LATERAL запускает подзапрос отдельно для каждой строки слева и разрешает обращаться к u.id.Добавьте индекс:
CREATE INDEX ON orders (user_id, created_at DESC);
Тогда PostgreSQL сможет брать последнюю запись прямо из индекса, не сортируя все заказы пользователя.
Такой приём особенно полезен для задач:
- последняя операция пользователя;
- актуальный статус заказа;
- последнее событие устройства;
- последние
N записей для каждой группы.Для больших таблиц это часто быстрее и проще, чем оконная функция по всему набору данных.