如何使用SQL MAX函数获取行的所有字段?

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)

Mar*_*ith 6

编辑只是更新我的以满足澄清的要求

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)


Bil*_*win 6

这是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)