Рассмотрите эту таблицу (из 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
Это часто возникающая проблема наибольшего числа 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;
Вы можете сделать это с помощью подзапроса
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
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
)