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

🐛 Типичные ошибки

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Практикум

⚡ Кратко: ошибки

  • Использовать не ту таблицу для задач 4–6.
  • Забывать ORDER BY при кумулятивном расчёте.
  • Путать COUNT(*) и COUNT(column).
  • Добавлять GROUP BY рядом с оконной функцией без нужды.
1

Ошибка: неправильная таблица для задач 4–6

Задачи 4, 5 и 6 работают с таблицей purchase_order_details, а не order_details. В purchase_order_details есть столбцы status_id, date_received и unit_cost.

-- Неправильно: order_details не содержит date_received и status_id
SELECT order_id, status_id, COUNT(product_id) OVER (PARTITION BY order_id, status_id)
FROM order_details;

-- Правильно
SELECT
    order_id,
    status_id,
    COUNT(product_id) OVER (PARTITION BY order_id, status_id) AS products_count
FROM purchase_order_details;
2

Ошибка: отсутствие ORDER BY при кумулятивном расчёте

Без ORDER BY функция вернёт одну общую сумму, а не накопительную.

-- Неправильно: одинаковое значение во всех строках
SELECT
    date_received,
    quantity,
    SUM(quantity) OVER () AS wrong_cumulative
FROM purchase_order_details;

Как исправить: добавьте ORDER BY в окно.

-- Правильно
SELECT
    date_received,
    quantity,
    SUM(quantity) OVER (ORDER BY date_received) AS cumulative_quantity
FROM purchase_order_details;
3

Ошибка: COUNT(column) вместо COUNT(*)

COUNT(product_id) не посчитает строки с NULL в product_id, а COUNT(*) посчитает все строки окна.

-- Может дать меньшее значение, если product_id содержит NULL
SELECT
    order_id,
    status_id,
    COUNT(product_id) OVER (PARTITION BY order_id, status_id) AS cnt
FROM purchase_order_details;

-- Правильно, если нужно число всех строк группы
SELECT
    order_id,
    status_id,
    COUNT(*) OVER (PARTITION BY order_id, status_id) AS cnt
FROM purchase_order_details;
4

Ошибка: лишний GROUP BY рядом с оконной функцией

GROUP BY сворачивает строки, поэтому совместное использование с оконной функцией часто приводит к ошибке или потере данных.

-- Неправильно
SELECT
    order_id,
    status_id,
    COUNT(*) OVER (PARTITION BY order_id, status_id)
FROM purchase_order_details
GROUP BY order_id;

Как исправить: уберите GROUP BY, если нужно сохранить детальные строки.

-- Правильно
SELECT
    order_id,
    status_id,
    COUNT(*) OVER (PARTITION BY order_id, status_id) AS products_count
FROM purchase_order_details;