Нужно выбрать пользователей, у которых число заказов выше среднего по всем пользователям. Какой запрос корректно считает «среднее по пользователям», а не «среднее по заказам»?

AWITH 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)
BSELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) > (SELECT AVG(COUNT(*)) FROM orders)
CSELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) > (SELECT AVG(amount) FROM orders)
DSELECT user_id FROM users WHERE user_id IN (SELECT AVG(orders_cnt) FROM cnt)
Правильный ответ. Нужно сначала агрегировать заказы до уровня пользователя, а затем считать среднее уже по этому уровню.

Разбор

Среднее по пользователям означает: для каждого пользователя считаем COUNT(*), получаем таблицу «пользователь → число заказов», и только потом берём AVG по этим значениям. Если пытаться посчитать среднее напрямую по таблице orders, легко перепутать уровень данных и получить другую метрику (например, среднее по строкам заказов). CTE помогает явно зафиксировать нужную гранулярность.

Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»