Нужно найти пользователей, у которых был хотя бы один заказ и при этом нет ни одного заказа со статусом canceled. Какой вариант корректно выражает это условие?
A
SELECT u.user_id FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id) AND NOT EXISTS (SELECT 1 FROM orders o2 WHERE o2.user_id = u.user_id AND o2.status = 'canceled')B
SELECT u.user_id FROM users u WHERE u.user_id NOT IN (SELECT o.user_id FROM orders o WHERE o.status = 'canceled') AND u.user_id IN (SELECT user_id FROM orders)C
SELECT u.user_id FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id AND o.status <> 'canceled') AND u.user_id IN (SELECT user_id FROM orders)D
SELECT u.user_id FROM users u LEFT JOIN orders o ON o.user_id = u.user_id GROUP BY u.user_id HAVING COUNT(o.order_id) > 0 AND SUM(CASE WHEN o.status = 'canceled' THEN 1 ELSE 0 END) = 0Правильный ответ. Комбинация
EXISTS + NOT EXISTS явно задаёт «есть хотя бы одна строка» и «нет ни одной строки с условием» для одного пользователя.Разбор
Важно разделить две части бизнес-логики: у пользователя должен быть хотя бы один заказ и среди его заказов не должно быть отменённых. NOT IN неожиданно ведёт себя при NULL, а вариант с EXISTS (... <> 'canceled') пропускает пользователей, у которых среди заказов есть и отменённые, и обычные. Пара EXISTS и NOT EXISTS делает оба требования явными и читабельными.
Проверь себя · 1/3разбор после ответа
Вы считаете метрику: доля пользователей, которые совершили покупку в течение 7 дней после регистрации. Какой вариант построения запроса делает логику наиболее проверяемой и удобной для отладки?
Ещё вопросы по теме «Подзапросы и 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» →