Очень частая задача - взять последнюю запись на пользователя, заказ, сущность. Многие делают это с
ROW_NUMBER(), хотя Postgres умеет проще:SELECT DISTINCT ON (user_id) *
FROM orders
ORDER BY user_id, created_at DESC;
DISTINCT ON оставляет первую строку в рамках группы, а порядок задаётся через ORDER BY:ORDER BY user_id, created_at DESC
Так первой будет именно самая свежая запись.
Если возможны одинаковые
created_at, лучше явно добавить тай-брейкер:ORDER BY user_id, created_at DESC, id DESC
Если нужно выбрать конкретные поля и избежать
SELECT *, просто укажите нужные колонки:SELECT DISTINCT ON (user_id)
user_id, id, created_at
FROM orders
ORDER BY user_id, created_at DESC, id DESC;
Выражения из
DISTINCT ON (...) обязаны быть левым префиксом ORDER BY, иначе Postgres выдаст ошибку.🔥 Такой запрос часто читается проще, чем
ROW_NUMBER(), и при подходящем индексе (user_id, created_at DESC, id DESC) может давать отличный план выполнения.➡️ SQL Ready | #совет
