Нужно выбрать пользователей, у которых число заказов выше среднего по всем пользователям. Какой запрос корректно считает «среднее по пользователям», а не «среднее по заказам»?
A
WITH cnt AS (SELECT user_id, COUNT(*) AS orders_cnt FROM orders GROUP BY user_id) SELECT user_id FROM cnt WHERE orders_cnt > (SELECT AVG(orders_cnt) FROM cnt)B
SELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) > (SELECT AVG(COUNT(*)) FROM orders)C
SELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) > (SELECT AVG(amount) FROM orders)D
SELECT user_id FROM users WHERE user_id IN (SELECT AVG(orders_cnt) FROM cnt)Правильный ответ. Нужно сначала агрегировать заказы до уровня пользователя, а затем считать среднее уже по этому уровню.
Разбор
Среднее по пользователям означает: для каждого пользователя считаем COUNT(*), получаем таблицу «пользователь → число заказов», и только потом берём AVG по этим значениям. Если пытаться посчитать среднее напрямую по таблице orders, легко перепутать уровень данных и получить другую метрику (например, среднее по строкам заказов). CTE помогает явно зафиксировать нужную гранулярность.
Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых
amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?Ещё вопросы по теме «Подзапросы и 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» →