← К оглавлению занятия

✅ Решения

⚡ Кратко: решения

  • Задание 1 — COUNT(*) OVER ().
  • Задание 2 — COUNT(*) OVER (PARTITION BY customer_id).
  • Задание 3 — GROUP BY сворачивает строки, окно сохраняет.
  • Задание 4 — SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date).
1

Решение задания 1. Общее окно

Без PARTITION BY окно охватывает все строки результата, поэтому COUNT(*) OVER () вернёт общее число заказов для каждой строки.

SELECT
    order_id,
    customer_id,
    order_date,
    amount,
    COUNT(*) OVER () AS total_orders
FROM orders;
2

Решение задания 2. Окно по клиенту

PARTITION BY customer_id разбивает строки на группы по клиентам. Функция COUNT считает заказы внутри каждой группы.

SELECT
    order_id,
    customer_id,
    order_date,
    amount,
    COUNT(*) OVER (PARTITION BY customer_id) AS orders_per_customer
FROM orders;
3

Решение задания 3. Сравнение с GROUP BY

Запрос с GROUP BY возвращает одну строку на клиента:

SELECT
    customer_id,
    COUNT(*) AS orders_per_customer
FROM orders
GROUP BY customer_id;

В запросе с оконной функцией строк столько же, сколько в таблице orders, и к каждой добавляется столбец orders_per_customer. В запросе с GROUP BY строк столько, сколько уникальных customer_id, и можно вывести только столбцы группировки и агрегаты.

4

Решение задания 4. Порядок в окне

ORDER BY order_date внутри OVER задаёт порядок, в котором сумма накапливается. Для каждого клиента строки сортируются по дате, и SUM считает сумму от первой даты до текущей.

SELECT
    order_id,
    customer_id,
    order_date,
    amount,
    SUM(amount) OVER (
        PARTITION BY customer_id
        ORDER BY order_date ASC
    ) AS running_total
FROM orders;