Нужно найти пользователей, чей самый ранний заказ (то есть MIN(created_at)) попадает в 2024 год. Какой вариант корректен?
A
SELECT user_id FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01' GROUP BY user_idB
SELECT user_id FROM orders o WHERE o.created_at = (SELECT MIN(created_at) FROM orders) AND o.created_at >= '2024-01-01' AND o.created_at < '2025-01-01'C
WITH first_order AS (SELECT user_id, MIN(created_at) AS first_dt FROM orders GROUP BY user_id) SELECT user_id FROM first_order WHERE first_dt >= '2024-01-01' AND first_dt < '2025-01-01'D
SELECT user_id FROM users u WHERE u.user_id IN (SELECT MIN(created_at) FROM orders GROUP BY user_id)Правильный ответ. Сначала нужно вычислить
MIN(created_at) на уровне пользователя, а потом фильтровать пользователей по году — это удобно делать через CTE.Разбор
Если просто отфильтровать orders по 2024 году, вы найдёте пользователей с любым заказом в 2024, но их первый заказ мог быть раньше. Правильная логика: (1) получить по каждому user_id дату первого заказа, (2) оставить тех, у кого эта дата лежит в нужном диапазоне. CTE делает этот двухшаговый расчёт понятным и проверяемым.
Проверь себя · 1/3разбор после ответа
Что является практическим преимуществом разбиения сложного запроса на шаги через
WITH по сравнению с несколькими вложенными подзапросами?Ещё вопросы по теме «Подзапросы и CTE»
- В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период. Какой подход обычно делает запрос более читаемым и позволяет переиспользовать шаг фильтрации?
- Вы выбираете пользователей, у которых есть хотя бы один платеж. В таблице `payments` поле `user_id` иногда бывает `NULL` (например, анонимные платежи). Почему в такой ситуации часто предпочитают `EXISTS`, а не `IN`?
- Вы пишете `SELECT u.user_id, (SELECT order_id FROM orders o WHERE o.user_id = u.user_id) AS last_order_id FROM users u`. Что может пойти не так и как исправить, чтобы подзапрос стал скалярным?
- Нужно выбрать заказы, у которых `amount` выше среднего `amount` по тому же пользователю. Какой вариант `WHERE` корректно использует коррелированный подзапрос?
- Вы готовите дашборд: нужно (1) топ товаров по выручке за период и (2) общая выручка за тот же период. Какой вариант снижает риск, что фильтр по периоду рассинхронизируется между расчётами?
- Все вопросы по «Подзапросы и CTE» →