Как получить все поля строки с помощью МАКС. функции SQL?

Рассмотрите эту таблицу (из http://www.tizag.com/mysqlTutorial/mysqlmax.php):

Id     name               type     price 
123451 Park's Great Hits  Music    19.99 
123452 Silly Puddy        Toy      3.99 
123453 Playstation        Toy      89.95 
123454 Men's T-Shirt      Clothing 32.50 
123455 Blouse             Clothing 34.97 
123456 Electronica 2002   Music    3.99 
123457 Country Tunes      Music    21.55 
123458 Watermelon         Food     8.73

Этот SQL-запрос возвращает самый дорогой объект из каждого типа: ВЫБЕРИТЕ тип, МАКС (цена) ОТ продуктов тип GROUP BY

Clothing $34.97
Food     $8.73
Music    $21.55
Toy      $89.95

Я также хочу получить полевой идентификатор и имя, которые принадлежат вышеупомянутому макс. цена для каждой строки. Какой SQL-запрос возвратит таблицу как это?

Id     name            type      price
123455 Blouse          Clothing  34.97
123458 Watermelon      Food      8.73
123457 Country Tunes   Music     21.55
123453 Playstation     Toy       89.95

6
задан Hugues Van Landeghem 24 May 2010 в 20:51
поделиться

3 ответа

Это часто возникающая проблема наибольшего числа n на группу . Мой обычный способ решения логически эквивалентен ответу @Martin Smith, но не использует подзапрос:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND T1.price < T2.price)
WHERE T2.price IS NULL;

У моего решения и всех других, представленных в этом потоке, есть шанс создать несколько строк для каждого значения тип , если более одного продукта используют один и тот же тип и оба имеют одинаковую цену, которая является макс. Есть способы решить эту проблему и устранить ничью, но вы должны сообщить нам, какой продукт «выигрывает» в таком случае.

Вам нужен какой-то другой атрибут, который гарантированно будет уникальным для всех строк, по крайней мере, для строк с тем же типом . Например, если продукт с большим значением Id должен выиграть, вы можете разрешить связь следующим образом:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND (T1.price < T2.price
       OR T1.price = T2.price AND T1.Id < T2.Id))
WHERE T2.price IS NULL;
6
ответ дан 8 December 2019 в 15:59
поделиться

Вы можете сделать это с помощью подзапроса

SELECT id, name, type, price FROM products p1
WHERE EXISTS (Select type, max(price) FROM Products p2 
              GROUP BY type
              WHERE p1.type=p2.type AND p1.price=p2.MAX(price))

или внутреннего соединения

SELECT id, name, type, price FROM products p1
INNER JOIN (Select type, max(price) FROM Products p2 GROUP BY type) maxPrice
         ON maxPrice=price=p1.price AND maxPrice.type=p1.price
3
ответ дан 8 December 2019 в 15:59
поделиться

Edit Просто обновляю свой, чтобы соответствовать уточненному требованию

SELECT Id, name, type,price 
FROM Table T1
WHERE NOT EXISTS(
          SELECT * FROM TABLE T2 
          WHERE T1.type=t2.type 
          AND T2.Price >= T1.Price 
          AND T2.Id > T1.Id
          )
6
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: