Как получить все поля ряд, используя функцию SQL MAX?
-
04-10-2019 - |
Вопрос
Рассмотрим эту таблицу (от 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 возвращает самый дорогой элемент из каждого типа: Выбор типа, MAX (цена) от группы продуктов по типу
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
Решение
Это greatest-n-per-group
Проблема, которая часто поднимается. Мой обычный способ решения оно логически эквивалентен ответу, данному @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;
Мое решение и все остальные, данные в этой теме до сих пор, имеют шанс создавать несколько строк в цену type
, если более одного продукта разделяет тот же тип, и оба имеют одинаковую цену, которая является максимальным. Есть способы решить это и сломать галстук, но вам нужно сказать нам, какой продукт «выигрывает» в этом случае.
Вам нужен какой-то другой атрибут, который гарантированно будет уникальным по всем рядам, по крайней мере, для строк с одинаковым type
. Отказ Например, если продукт с тем большим 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 Table T1
WHERE NOT EXISTS(
SELECT * FROM TABLE T2
WHERE T1.type=t2.type
AND T2.Price >= T1.Price
AND T2.Id > T1.Id
)
Вы можете сделать это с подведем
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