Концепция оконной функции и 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. Сама оконная функция входные строки не удаляет и не объединяет.
