Товары с максимальной ценой в каждой категории товаров

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

Если в одной категории несколько товаров имеют одинаковую максимальную цену, в результат попадут все такие товары.