考虑此表:
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查询返回每种类型中最昂贵的商品:SELECT类型,MAX(price)FROM产品GROUP BY类型
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给出的答案,但不使用子查询:
greatest-n-per-group
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
您还需要其他一些属性,这些属性必须保证在所有行中都是唯一的,至少对于具有same的行而言是唯一的type。例如,如果具有更大Id价值的产品获胜,则可以通过以下方式解决平局:
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;