Зачем LATERAL
Вопрос
Нужно для каждого клиента вывести 3 его последних заказа. Какой инструмент PostgreSQL решает это прямо, подзапросом с ORDER BY ... LIMIT 3 для каждого клиента?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
JOIN LATERAL (... ORDER BY created_at DESC LIMIT 3)правильный ответ- Обычный подзапрос в FROM: он видит колонки таблиц слева
GROUP BY customer_idсLIMIT 3после группировкиDISTINCT ON (customer_id)сLIMIT 3в конце
Разбор
Обычный подзапрос в FROM не может ссылаться на таблицы слева от себя, LATERAL снимает это ограничение: JOIN LATERAL (SELECT ... WHERE o.customer_id = c.id ORDER BY created_at DESC LIMIT 3) выполняется для каждой строки клиента. LIMIT в запросе с GROUP BY ограничивает число групп, а не строк в группе. DISTINCT ON оставляет ровно одну строку на клиента. Альтернатива без LATERAL: ROW_NUMBER в подзапросе и фильтр rn <= 3.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Подзапросы и CTE»
- Полный путь категории в дереве
- Клиенты, у которых все заказы оплачены
- Дни без продаж по регионам
- Цепочка руководителей вверх по дереву
- Дороже любой книги: ALL против MAX
- Категория с максимальной выручкой
- Два последних заказа каждого клиента через LATERAL
- Дороже среднего по своей категории