15. Найти товары с максимальной ценой в каждой категории
Условие задачи:
Дана таблица Prices с товарами, их категориями и ценами.
Необходимо для каждой категории вывести товар с максимальной ценой:
Category— категория;Name— название товара;Price— максимальная цена в категории.
Если несколько товаров имеют одинаковую максимальную цену, необходимо вывести их все.
Код:
Name | Category | Price
------------|---------------------|------
Апельсин | Фрукты | 50
Мандарин | Фрукты | 45
Яблоко | Фрукты | 30
Огурец | Овощи | 35
Томат | Овощи | 40
Картофель | Овощи | 25
Молоко | Молочные продукты | 30
Творог | Молочные продукты | 40
Спойлеры к решению
Подсказки
💡 Для каждой категории необходимо определить максимальную цену.
💡 Можно использовать оконную функцию
💡 Затем оставить только товары, цена которых равна максимуму своей категории.
💡 Такой подход корректно вернёт несколько товаров, если максимальная цена совпадает.
💡 Можно использовать оконную функцию
MAX() OVER (PARTITION BY ...).💡 Затем оставить только товары, цена которых равна максимуму своей категории.
💡 Такой подход корректно вернёт несколько товаров, если максимальная цена совпадает.
Решение
Вариант с оконной функцией:
SELECT
Category,
Name,
Price
FROM (
SELECT
Category,
Name,
Price,
MAX(Price) OVER (
PARTITION BY Category
) AS max_price
FROM Prices
) p
WHERE Price = max_price;
Оконная функция:
MAX(Price) OVER (PARTITION BY Category)
вычисляет максимальную цену отдельно для каждой категории, не объединяя строки в одну.
После этого условие:
WHERE Price = max_price
оставляет только самые дорогие товары.
Для приведённых данных результат будет:
Category | Name | Price
--------------------|-----------|------
Фрукты | Апельсин | 50
Овощи | Томат | 40
Молочные продукты | Творог | 40
Если в одной категории несколько товаров имеют одинаковую максимальную цену, в результат попадут все такие товары.