Пользователи с тратами выше среднего
// Условие
Найдите пользователей, чья суммарная сумма завершённых заказов превышает среднюю суммарную сумму по всем пользователям (у которых есть завершённые заказы). Выведите user_id и total_spent. Отсортируйте по total_spent по убыванию. Первые 10.
// Таблицы
sandbox.orders
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
CTEПодзапросAVGSUM
// Решение
Подсказка
Подзапрос: сначала посчитайте total_spent для каждого пользователя, затем сравните со средним через подзапрос или CTE.
Сначала попробуй сам → Показать решение
WITH user_totals AS (
SELECT
user_id,
SUM(amount) AS total_spent
FROM sandbox.orders
WHERE status = 'completed'
GROUP BY user_id
)
SELECT
user_id,
total_spent
FROM user_totals
WHERE total_spent > (SELECT AVG(total_spent) FROM user_totals)
ORDER BY total_spent DESC
LIMIT 10;
Двухуровневая логика: сначала считаем total_spent на пользователя (CTE), потом фильтруем тех, у кого total_spent выше среднего. Подзапрос в WHERE берёт AVG из той же CTE. Альтернатива — без CTE, с вложенным подзапросом в FROM, но CTE читаемее.