PostgreSQL LATERAL: получить последнюю дочернюю запись
LATERAL позволяет подзапросу использовать поля строки слева от JOIN. В сочетании с ORDER BY и LIMIT 1 это выбирает последнюю связанную запись отдельно для каждого родителя. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.
Рабочий пример
WITH users(id) AS (VALUES (1), (2)),
events(user_id, created_at, note) AS (
VALUES (1, timestamp '2026-10-01', 'first'),
(1, timestamp '2026-10-02', 'latest'),
(2, timestamp '2026-10-01', 'only')
)
SELECT users.id, latest.note
FROM users
LEFT JOIN LATERAL (
SELECT note FROM events
WHERE events.user_id = users.id
ORDER BY created_at DESC LIMIT 1
) AS latest ON true;LEFT JOIN сохраняет родителей без дочерних событий и возвращает NULL в выбранных колонках. Для больших таблиц создайте индекс по (user_id, created_at DESC).
Частый вопрос
Зачем здесь слово LATERAL?
Оно разрешает подзапросу справа ссылаться на users.id из текущей строки слева. Без LATERAL такая корреляция в FROM не разрешается.