SQLでカテゴリごとに最大・最小の値を持つ行を取得する
SQLではよくあるケースだけど案外書くのが難しい書き方。 これが一番簡単だと思いますが、もっといい方法があったら教えてください。 やりたいこと なんらかのカテゴリーごとに順番で並べて一番数値が高い行の他のカラムのデータを取得するクエリです。 たとえば、下記のitemsというテーブルがあったときcategoryごとにpriceが最も高いnameを取得するという問題です。 itemsテーブル category name price belt a 2000 belt b 10000 belt c 4000 wallet d 3000 wallet e 60000 wallet f 15000 wallet g 20000 求める結果 category name price belt b 10000 wallet e 60000 クエリの例 この問題はwindow関数でrow_number関数を使うことで記述する方法がオススメです。 select category, name, price from ( select category, name, price, row_number() over (partition by category order by price desc) as price_order from items ) where price_order = 1 なにをやっているのか簡単に言うと partition by category でcategoryごとにわけて order by price desc でprice降順で並びかえたところに row_number() で順番に番号を割り当てています。 これによってpriceが最も高いとprice_orderカラムに1が入り降順で番号が割り当てられます。 これをサブクエリとして price_order = 1 に絞り込むことで最大の値が手に入るという仕組みです。 注意点として同じpriceの行が複数存在する場合はどれか1行しか得られません。 ...