Ответ
WITH ranked_orders AS (
SELECT
customer_id,
order_id,
order_date,
total_amount,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY total_amount DESC) as rank
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
),
customer_stats AS (
SELECT
customer_id,
COUNT(order_id) as order_count,
SUM(total_amount) as total_spent
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 5
)
SELECT
c.customer_name,
cs.order_count,
cs.total_spent,
ro.order_id as top_order_id,
ro.total_amount as top_order_amount
FROM customers c
JOIN customer_stats cs ON c.customer_id = cs.customer_id
JOIN ranked_orders ro ON c.customer_id = ro.customer_id AND ro.rank = 1
ORDER BY cs.total_spent DESC
LIMIT 10;
Этот запрос:
- Использует два CTE (Common Table Expressions)
- Первый CTE ранжирует заказы по сумме для каждого клиента
- Второй CTE вычисляет статистику по клиентам с фильтрацией
- Основной запрос соединяет данные из CTE с таблицей клиентов
- Сортирует по общей сумме покупок и ограничивает вывод 10 записями