SQL-запрос для получения максимального размера столбца и отображения с каждой строкой

#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