Топ товаров в SQL: три строки или три места с учётом ничьих
Менеджер просит три лучших товара, а SQL возвращает четыре строки. Это не всегда ошибка: при одинаковой выручке несколько товаров могут делить одно место. До выбора оконной функции нужно договориться, что именно ограничивает число три.
Как разобрать ситуацию
ROW_NUMBER даёт ровно заданное количество строк при однозначном порядке. RANK сохраняет ничьи и пропуски мест, DENSE_RANK — ничьи без пропусков. В примере нужны два лучших уровня выручки, поэтому используется DENSE_RANK. Если нужен ровно список из двух товаров, потребуется дополнительное правило, например сортировка по id при равенстве.
Пример и ожидаемый результат
Выручка четырёх товаров равна 100, 90, 90 и 80. Два лучших уровня включают три товара: первый и двух участников второго места. Это ожидаемое поведение, а не дубль.
WITH sales(id,revenue) AS(VALUES(1,100),(2,90),(3,90),(4,80)), r AS(
SELECT *,DENSE_RANK() OVER(
ORDER BY revenue DESC) place
FROM sales)
SELECT id,place
FROM r
WHERE place<=2
ORDER BY id;Результат содержит товары 1, 2 и 3 с местами 1, 2 и 2. Товар 4 не попадает в выбранные два уровня.
Проверка перед применением
- Проверьте набор, где у всех товаров одинаковая выручка.
- Добавьте товар с нулевым результатом и заранее определите, допускается ли он в рейтинг.
- Не добавляйте id в окно DENSE_RANK, если хотите сохранить ничьи по одной только выручке.
В подписи графика лучше написать «два уровня выручки» или «ровно два товара», а не оставлять неоднозначное «топ-2». Если рейтинг используется для премий, правило разрешения ничьих становится частью бизнес-контракта и должно проверяться на контрольных данных вместе с самим запросом.
Границы решения
Рейтинг зависит от периода, валюты и состава оплаченных операций. Оконная функция не делает разные денежные определения сопоставимыми. В примере сумма по товару уже подготовлена.
Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе
Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.
Техническая справка: www.sqlite.org: документация.
Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Две корзины с одинаковой суммой: как сравнить состав товаров в SQL, Скользящее среднее SQL: три строки не всегда равны трём дням.
