前提・実現したいこと
特定のカラムごとにまとめて最大値を持つ行を抜き出したい
こういうときの良いSQLの書き方を教えてほしいです。
該当のソースコード
以下のようなデータで、クラスごとに最大点をとった人の
クラス、点数、名前を抜き出したいです。
同率一位がいた場合は全員抜き出したいです。
対象のデータ
studentテーブル
class | point | name |
---|---|---|
A | 30 | 佐藤 |
A | 60 | 安田 |
A | 60 | 鈴木 |
B | 60 | 田中 |
B | 80 | 高橋 |
C | 30 | 山田 |
C | 50 | 伊藤 |
取り出したい形
class | point | name |
---|---|---|
A | 60 | 安田 |
A | 60 | 鈴木 |
B | 80 | 高橋 |
C | 50 | 伊藤 |
以下のような副問合せで取り出せそうだと思いましたが、これだとあるクラスの最高点と同じ他の人も抜き出してしまっていました。
(この例だとAの最高点(60)と同じBの田中も抜き出してしまっていました)
SQL
1SELECT 2 s1.class, 3 s1.point, 4 s2.name 5FROM ( 6 SELECT 7 class, 8 MAX(point) AS point 9 FROM 10 student 11 GROUP BY 12 class) s1 13 JOIN student s2 ON s1.point = s2.point
質問したいこと
上記の取り出し方ができるSQLを知りたいです。
また取り出したいデータに対してSQLが複雑な気がするのですが、もっと簡潔な書き方はありますでしょうか。
window関数とかを使えばもっと簡潔にかけそうな気がするのですがよくわかっておりません。
例えば以下のような考え方ではできないのでしょうか。
SQL
1SELECT 2 class, 3 name, 4 MAX(point) OVER (PARTITION BY class) AS max 5FROM 6 student 7WHERE 8 point = max --動かないですが最大値と一致する行を条件にしたいつもり
回答1件
あなたの回答
tips
プレビュー