Нужно найти пользователей, чей самый ранний заказ (то есть MIN(created_at)) попадает в 2024 год. Какой вариант корректен?
AФильтровать
orders по диапазону created_at за 2024 и сгруппировать по user_id: возьмёт всех с любым заказом в 2024 годуBСравнить
o.created_at с глобальным (SELECT MIN(created_at) FROM orders) и добавить условие на 2024 год: фильтр по глобальному минимуму, не по пользователюCВ
CTE first_order посчитать MIN(created_at) по user_id, затем взять пользователей с first_dt в диапазоне 2024 годаDВыбрать
user_id из users, где идентификатор лежит в (SELECT MIN(created_at) FROM orders GROUP BY user_id): сравнение идентификатора с датой через INПравильный ответ. Сначала вычислите
MIN(created_at) на уровне пользователя, а потом фильтруйте пользователей по году — это удобно делать через CTE.Разбор
Если просто отфильтровать orders по 2024 году, найдутся пользователи с любым заказом в 2024, но их первый заказ мог быть раньше. Правильная логика: получить по каждому user_id дату первого заказа, затем оставить тех, у кого эта дата лежит в нужном диапазоне. CTE делает этот двухшаговый расчёт понятным. Вариант с глобальным MIN(created_at) найдёт только пользователей с самой ранней датой во всей таблице, а сравнение user_id с датой через IN логически некорректно: типы не совпадают.
Проверь себя · 1/3разбор после ответа
Дашборд содержит две метрики на одних и тех же продажах: топ товаров по выручке за период и общая выручка за тот же период. Витрина обновляется ежедневно, и важно, чтобы фильтр по периоду был один и тот же для обеих цифр. Какой подход надёжнее защищает от рассинхронизации?
Ещё вопросы по теме «Подзапросы и 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` корректно использует коррелированный подзапрос?
- Дашборд содержит две метрики на одних и тех же продажах: топ товаров по выручке за период и общая выручка за тот же период. Витрина обновляется ежедневно, и важно, чтобы фильтр по периоду был один и тот же для обеих цифр. Какой подход надёжнее защищает от рассинхронизации?
- Все вопросы по «Подзапросы и CTE» →