Нужно вывести список пользователей, которые сделали покупку в 2025 году, без дубликатов. Какой вариант делает это корректно без DISTINCT?
A
SELECT u.user_id FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id AND o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01')B
SELECT u.user_id FROM users u JOIN orders o ON o.user_id = u.user_id WHERE o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01'C
SELECT o.user_id FROM orders o WHERE o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01' GROUP BY o.user_id HAVING COUNT(*) >= 1D
SELECT u.user_id FROM users u WHERE (SELECT MAX(o.order_id) FROM orders o WHERE o.user_id = u.user_id AND o.created_at >= '2025-01-01' AND o.created_at < '2026-01-01') IS NOT NULLПравильный ответ.
EXISTS проверяет наличие связанных строк и сохраняет по одной строке внешней таблицы — без DISTINCT.Разбор
Если брать строки напрямую из таблицы заказов или соединять её с пользователями через JOIN, пользователь с несколькими заказами появится несколько раз — без DISTINCT или агрегации это даст дубликаты. Вариант с GROUP BY тоже опирается на агрегацию по заказам и работает не на уровне пользователей. Конструкция EXISTS проверяет наличие хотя бы одной связанной строки и не размножает строки внешней таблицы, поэтому возвращает каждого пользователя ровно один раз.
Проверь себя · 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» →