Sobes.tech
Назад к вопросам
Middle
7

Как структурировать запрос с промежуточной таблицей для максимальной даты курса?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что запрос строится в два шага: сначала вычисляется промежуточный набор данных, потом из него выбирается нужная максимальная дата. Обычно для этого используют CTE, подзапрос или временную таблицу. Важно уметь отфильтровать данные по курсу и корректно взять последнюю доступную дату.

Определение:

Промежуточная таблица в SQL — это результат первого шага запроса, который используется дальше для более удобной и читаемой обработки. Для задачи с максимальной датой курса обычно сначала собирают все записи по нужному курсу, а затем агрегируют их по дате или берут запись с самой поздней датой.

Пример использования:

Допустим, есть таблица course_events с полями course_id, event_date, price. Нужно получить последнюю дату, когда для конкретного курса фиксировалась запись.

WITH filtered_course AS (
    SELECT
        course_id,
        event_date,
        price
    FROM course_events
    WHERE course_id = 101
)
SELECT MAX(event_date) AS max_event_date
FROM filtered_course;

Если нужно не только максимальную дату, но и строку с этой датой, можно сделать так:

WITH max_date AS (
    SELECT
        course_id,
        MAX(event_date) AS max_event_date
    FROM course_events
    WHERE course_id = 101
    GROUP BY course_id
)
SELECT e.course_id, e.event_date, e.price
FROM course_events e
JOIN max_date m
  ON e.course_id = m.course_id
 AND e.event_date = m.max_event_date;

Пояснение кода:

Код нужен, потому что вопрос про SQL-структуру запроса.

В первом примере:

  1. WITH filtered_course AS (...) создаёт промежуточный набор только по курсу 101.
  2. Во внешнем запросе считается MAX(event_date).
  3. В результате возвращается одна максимальная дата по этому курсу.

Во втором примере:

  1. В CTE max_date вычисляется максимальная дата по курсу.
  2. Затем основная таблица соединяется с этим результатом.
  3. Так можно получить не только дату, но и все поля строки, которая соответствует этой дате.
  4. Если несколько строк имеют одинаковую максимальную дату, join вернёт все такие строки.

Ключевые моменты:

  • Для такой задачи удобно использовать CTE (WITH) — это читаемее, чем вложенные подзапросы.
  • Если нужна только дата, достаточно MAX(date_column).
  • Если нужна вся строка с максимальной датой, нужно сначала найти дату, потом сделать JOIN.
  • Стоит учитывать, что при одинаковой максимальной дате может быть несколько строк.
  • Для больших таблиц важны индексы по полям фильтрации и соединения, например по course_id и event_date.
  • Если нужна “последняя запись”, а не просто максимальная дата, нужно уточнять логику: по одной колонке даты или с дополнительной сортировкой по времени/ID.