Как структурировать запрос с промежуточной таблицей для максимальной даты курса?
Ответ от нейросети
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-структуру запроса.
В первом примере:
WITH filtered_course AS (...)создаёт промежуточный набор только по курсу101.- Во внешнем запросе считается
MAX(event_date). - В результате возвращается одна максимальная дата по этому курсу.
Во втором примере:
- В CTE
max_dateвычисляется максимальная дата по курсу. - Затем основная таблица соединяется с этим результатом.
- Так можно получить не только дату, но и все поля строки, которая соответствует этой дате.
- Если несколько строк имеют одинаковую максимальную дату, join вернёт все такие строки.
Ключевые моменты:
- Для такой задачи удобно использовать
CTE(WITH) — это читаемее, чем вложенные подзапросы. - Если нужна только дата, достаточно
MAX(date_column). - Если нужна вся строка с максимальной датой, нужно сначала найти дату, потом сделать
JOIN. - Стоит учитывать, что при одинаковой максимальной дате может быть несколько строк.
- Для больших таблиц важны индексы по полям фильтрации и соединения, например по
course_idиevent_date. - Если нужна “последняя запись”, а не просто максимальная дата, нужно уточнять логику: по одной колонке даты или с дополнительной сортировкой по времени/ID.