Как выбрать товар, который имеет максимальную цену для каждой категории?
Ниже приведена моя таблица, содержащая такой элемент, как:
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 в этой таблице.
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 = 1Sqlfiddle 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 CategoryMAX, чтобы получить самую высокую цену за каждую категорию.
select * from (Select *, row_number() over (partition by category order by price desc) rn from products) v where rn=1
Вот еще один способ сделать это, где 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