📁 Блок: 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;