Yia*_*lis 6 sql firebird max firebird2.1 greatest-n-per-group
考虑这个表(来自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
Run Code Online (Sandbox Code Playgroud)
此SQL查询返回每种类型中最昂贵的项:SELECT类型,MAX(价格)FROM产品GROUP BY类型
Clothing $34.97
Food $8.73
Music $21.55
Toy $89.95
Run Code Online (Sandbox Code Playgroud)
我还希望为每一行获取属于上述最高价格的字段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
Run Code Online (Sandbox Code Playgroud)
编辑只是更新我的以满足澄清的要求
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
)
Run Code Online (Sandbox Code Playgroud)
这是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;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方案以及此线程上给出的所有其他解决方案都有可能为每个值生成多行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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3104 次 |
| 最近记录: |