Выбор ответа Senior Подзапросы и CTE обновлено

Зачем LATERAL

Вопрос

Нужно для каждого клиента вывести 3 его последних заказа. Какой инструмент PostgreSQL решает это прямо, подзапросом с ORDER BY ... LIMIT 3 для каждого клиента?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: JOIN LATERAL (... ORDER BY createdat DESC LIMIT 3). Обычный подзапрос в FROM не может ссылаться на таблицы слева от себя, LATERAL снимает это ограничение: JOIN LATERAL (SELECT ...

Варианты ответа

  1. JOIN LATERAL (... ORDER BY created_at DESC LIMIT 3)правильный ответ
  2. Обычный подзапрос в FROM: он видит колонки таблиц слева
  3. GROUP BY customer_id с LIMIT 3 после группировки
  4. 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 ошибок.