Как выбрать товар, который имеет максимальную цену для каждой категории?



Ниже приведена моя таблица, содержащая такой элемент, как:



ProductId       ProductName Category        Price
1 Tiger Beer $12.00
2 ABC Beer $13.99
3 Anchor Beer $9.00
4 Apolo Wine $10.88
5 Randonal Wine $18.90
6 Wisky Wine $30.19
7 Coca Beverage $2.00
8 Sting Beverage $5.00
9 Spy Beverage $4.00
10 Angkor Beer $12.88


И я предполагаю, что у меня есть только три category в этой таблице (я могу иметь много category в этой таблице). И я хочу показать максимальную цену продукта каждого category в этой таблице.

624   6  

6 ответов:

Попробуйте это, если вы хотите получить весь ряд,

(поддерживает большинство СУБД )

SELECT  a.*
FROM    tbProduct a
        INNER JOIN
        (
            SELECT Category, MAX(Price) maxPrice
            FROM tbProduct
            GROUP BY Category
        ) b ON a.category = b.category AND
                a.price = b.maxPrice

Если вы используете MSSQL 2008+

WITH allProducts AS
(
SELECT  ProductId,ProductName,Category,Price,
        ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY Price DESC) ROW_NUM
FROM tbProduct
)
SELECT ProductId,ProductName,Category,Price
FROM allProducts
WHERE ROW_NUM = 1

Или

SELECT ProductId,ProductName,Category,Price
FROM    
(
SELECT  ProductId,ProductName,Category,Price,
        ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY Price DESC) ROW_NUM
FROM tbProduct
) allProducts
WHERE ROW_NUM = 1

Sqlfiddle Demo

SELECT   Category,max(Price) as Price
FROM     tbProduct
GROUP BY Category

Если вы хотите получить другие поля также вместе с именем категории, то:

select * 
from  tbProduct T
join   (
         select Category,max(Price) as Price
         from tbProduct
         group by Category)a
on     T.Category=a.Category
and    T.Price=a.Price

Это должно сработать:

SELECT Category, MAX(Price)
FROM Products
GROUP BY Category
Это группирует таблицу по каждой категории и использует агрегатную функцию MAX, чтобы получить самую высокую цену за каждую категорию.
select *
from
(Select *, 
        row_number() over (partition by category order by price desc) rn 
        from products) v
where rn=1
SELECT   Category,max(Price) as ProdPrice
FROM     tbProduct
GROUP BY Category

Вот еще один способ сделать это, где MAX рассматривается как аналитическая функция (доступна с SQL Server 2005)

    Declare @t table(ProductId  int identity, ProductName varchar(100), Category varchar(20), Price numeric(10,2))
    Insert Into @t Select 'Tiger','Beer',12.00
    Insert Into @t Select 'ABC','Beer',13.99
    Insert Into @t Select 'Anchor','Beer',9.00
    Insert Into @t Select 'Apolo','Wine',10.88
    Insert Into @t Select 'Randonal','Wine',18.90
    Insert Into @t Select 'Wisky','Wine',30.19
    Insert Into @t Select 'Coca','Beverage',2.00
    Insert Into @t Select 'Sting','Beverage',5.00
    Insert Into @t Select 'Spy','Beverage',4.00
    Insert Into @t Select 'Angkor','Beer',12.88

SELECT ProductId,ProductName,Category,Price
FROM(
        SELECT
            ProductId
            ,ProductName
            ,Category
            ,Price
            ,CASE WHEN Price =  MAX(Price) OVER(PARTITION BY Category ORDER BY (SELECT 1)) THEN 'Take' ELSE 'Leave' END AS PickUp   

        FROM @t

        )X  WHERE PickUp = 'Take' ORDER BY 1

Результат

ProductId   ProductName Category    Price
2           ABC         Beer            13.99
6           Wisky       Wine            30.19
8           Sting       Beverage        5.00

Comments

    Ничего не найдено.