Нужно посчитать средний дневной доход: сначала SUM(amount) по каждому дню, затем AVG по дням. Какой запрос соответствует этой логике?

ASELECT AVG(day_revenue) FROM (SELECT pay_date, SUM(amount) AS day_revenue FROM payments GROUP BY pay_date) d
BSELECT AVG(SUM(amount)) FROM payments GROUP BY pay_date
CSELECT AVG(amount) FROM payments
DSELECT SUM(amount) / COUNT(*) FROM payments
Правильный ответ. Для «агрегации над агрегацией» удобно вынести первый уровень в подзапрос в FROM (или CTE), а затем агрегировать второй раз.

Разбор

Средний дневной доход — это среднее по дням, а не среднее по платежам. Поэтому сначала нужно получить таблицу «день → выручка дня» (через GROUP BY pay_date), и только потом считать AVG по этим дневным суммам. Подзапрос в FROM делает уровни агрегации явными и уменьшает вероятность перепутать метрику.

Проверь себя · 1/3разбор после ответа
В одном отчёте вы считаете несколько метрик по событиям: dau, wau и число покупок. У всех метрик один и тот же фильтр: только продакшн-трафик и только выбранный период. Какой подход лучше защищает от ситуации, когда в одной метрике забыли часть фильтра?
Тренировать SQL в Telegram

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