Топ-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 редко возникают из-за незнания синтаксиса. Гораздо чаще никто просто не зафиксировал определение.