如何使用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查询从每种类型中返回最昂贵的项目:从类型类型中选择类型,最大(价格)。
Clothing $34.97
Food $8.73
Music $21.55
Toy $89.95
我也想获得领域 ID 和 姓名 每行属于上述最大价格。什么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
不隶属于 StackOverflow