Приведи пример написания сложного запроса PostgreSQL

«Приведи пример написания сложного запроса PostgreSQL» — вопрос из категории SQL, который задают на 27% собеседований Системный Аналитик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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;

Этот запрос:

  1. Использует два CTE (Common Table Expressions)
  2. Первый CTE ранжирует заказы по сумме для каждого клиента
  3. Второй CTE вычисляет статистику по клиентам с фильтрацией
  4. Основной запрос соединяет данные из CTE с таблицей клиентов
  5. Сортирует по общей сумме покупок и ограничивает вывод 10 записями