Оконные функции

Концепция оконной функции и OVER с PARTITION BY

Содержание курса

Ловушка: ожидание одной строки на категорию вместо полного набора строк

Рассмотрим типичную ошибку: нужен детальный список продаж с итогом по категории, но запрос написан через GROUP BY:

SELECT category, sale_id, SUM(amount) AS category_total
FROM sales
GROUP BY category;

Такой запрос схлопывает строки до одной на категорию. SQLite выполнит его, но возьмёт sale_id из неопределённой строки группы; строгие СУБД могут отклонить такой bare column. В любом случае sale_id не описывает всю группу и не даёт нужной детализации. Исправление начинается не с добавления ещё одного поля в GROUP BY, а с проверки зерна результата. Если одна строка должна означать одну продажу, группировка здесь вообще не нужна:

SELECT
    sale_id,
    category,
    amount,
    SUM(amount) OVER (PARTITION BY category) AS category_total
FROM sales;

Проверяйте запрос по шагам. Сначала выполните SELECT без оконного столбца и посчитайте детальные строки. Затем добавьте SUM(...) OVER и убедитесь, что те же sale_id сохранились, а итог повторяется внутри категории. Если число строк изменилось, ищите причину в других конструкциях: WHERE или HAVING, LIMIT, DISTINCT, GROUP BY либо кратности JOIN. Сама оконная функция входные строки не удаляет и не объединяет.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.