SQL Max関数を使用して行のすべてのフィールドを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2893903

質問

このテーブルを検討してください(from 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top