Хотите получить несколько лучших элементов в каждой категории? Это типичная задача аналитики, и решается она с помощью оконных функций.
Создадим таблицу:
CREATE TABLE sales (
id INT,
customer VARCHAR(100),
amount DECIMAL(10,2)
);
Запрос для топ-2 заказов на клиента:
SELECT id, customer, amount
FROM (
SELECT id, customer, amount,
ROW_NUMBER() OVER (
PARTITION BY customer
ORDER BY amount DESC
) AS rnk
FROM sales
) t
WHERE rnk <= 2;
Функция
ROW_NUMBER() нумерует строки внутри каждой группы. Если у клиента есть пять заказов, они сортируются по убыванию суммы, и первые два остаются.Пример для клиента с 5 заказами:
id | customer | amount
-----------------------
12 | Ivanov | 980.00
15 | Ivanov | 750.00
-- остальные (3 строки) отсеялись
🔥 Важно понимать:
ROW_NUMBER() всегда уникален. Даже если два заказа на одинаковую сумму, один попадёт в выборку, а другой — нет. Если же нужны все одинаковые значения, лучше использовать RANK() или DENSE_RANK()➡️ SQL Ready | #практика