Топ товаров в 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: три строки не всегда равны трём дням.