#sql #sql-server
#sql #sql-сервер
Вопрос:
Вот мой сценарий… Несколько элементов с несколькими типами элементов, которые имеют несколько цен. Хотите выбрать товары со всеми типами, показывающими максимальную цену. Не могу понять, как получить максимальное значение?
Ввод:
ProductId ProductType Description Price
1 Запеченные БОБЫ 1.29
1 B ЗАПЕЧЕННЫЕ БОБЫ 1.98
Вывод:
ProductId ProductType Description Price
1 Запеченные БОБЫ 1.98
1 B ЗАПЕЧЕННЫЕ БОБЫ 1.98
Есть предложения?
Ответ №1:
Попробуйте это:
SELECT ProductId,
ProductType,
Description,
b.price
FROM <YOUR_TABLE> a,
(SELECT MAX(price) price FROM <YOUR_TABLE>) b
Для тех, кто любит синтаксис ANSI:
SELECT ProductId,
ProductType,
Description,
b.price
FROM <YOUR_TABLE> a INNER JOIN
(SELECT MAX(price) price FROM <YOUR_TABLE>) b
ON 1=1
Комментарии:
1. Хотя я бы никогда не рекомендовал использовать синтаксис, разделенный запятыми. Настанет день, когда SQL Server перестанет его поддерживать (если бы только это могло произойти раньше).
2. @Thomas: Обновил сообщение ANSII-версией join
Ответ №2:
Select ProductId, ProductType, Description, MaxByDesc.MaxPrice
From Product
Join (
Select Description, Max(Price) As MaxPrice
From Product
Group By Description
) As MaxByDesc
On MaxByDesc.Description = Product.Description
Если вы используете SQL Server 2005 или более поздней версии:
Select ProductId, ProductType, Description
, Max( Price ) Over ( Partition By Description ) As MaxPrice
From Product
Комментарии:
1. Это работает. Большое спасибо! Я использую ROW_NUMBER() в своем подзапросе, чтобы получить самую свежую цену. Не знал, что я могу использовать MAX () с разделением ПО…
Ответ №3:
Томас, верно, за исключением этого, вам нужно сгруппировать по типу:
Select ProductId, ProductType, Description, MaxByDesc.MaxPrice
From Product
Join (
Select Description, Max(Price) As MaxPrice
From Product
Group By ProductType
) As MaxByDesc
On MaxByDesc.ProductType = Product.ProductType
Ответ №4:
Другой способ:
SELECT ProductId
, ProductType
, Description
, ( SELECT MAX(price)
FROM Product pg
WHERE pg.Description = p.Description
) AS MaxPrice
FROM Product p