Топ-3 продукта по продажам в каждой категории

Задача по SQL: "Выведи топ-3 продукта по продажам в каждой категории"

Выглядит просто — и быстро отсеивает людей.

Большинство начинает сразу с GROUP BY. Получается суммарные продажи по категории — симпатичная таблица, но это не ответ. Вопрос про топ-3 внутри каждой категории, а не про одно число на категорию.

Оконная функция решает задачу: ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) Она нумерует строки внутри каждой категории, а потом вы оставляете номера с 1 по 3. Один проход, никаких self-join'ов, никаких громоздких подзапросов.

Сложнее — ответить на два вопроса до того, как писать код: 1. Что происходит при равенстве значений? ROW_NUMBER выберет одного победителя, RANK сохранит обоих — и отчёты будут выглядеть по-разному. 2. Что значит "топ по продажам"? Выручка, штуки или маржа? Три человека прочитают одно и то же предложение и построят три разных отчёта.

Ошибки в SQL редко возникают из-за незнания синтаксиса. Гораздо чаще никто просто не зафиксировал определение.

#SQL

t.me/nullpp/167

Топ-3 продукта по продажам в каждой категории | Сетка — социальная сеть от hh.ru