mySQL 最大値を持つレコードを取得(row_number() over())
最大値じゃなくて、最大値を持つレコードが欲しい。ウィンドウ関数(窓関数)ってのが便利らしい
作成日:2022-03-20, 更新日:2022-11-17
基本
方法はいくつかある
- グループ化してmax()で取得
- 窓関数である「row_number() over()」
- not existsを使う
グループ化してmax()で取得
遅くなる・・・とかで保留
窓関数である「row_number() over()」
窓関数ってのがあるらしい。
理解はできないけど、「ソートして連番を振る。その連番の1番目を取得」ってコトをすればいい。
▼こんな感じ
select max_records.* from ( select * ,( row_number() over( partition by 「グループにしたいカラム」 order by 「ソート順の指定」 ) ) max_num from xxxx ) max_records where 1 and max_records.max_num = 1 # 連番の一つ目を指定
クエリのメモ
考え方
- まず、ソート順に連番を付与したテーブルを用意
- 連番の一つ目を取得
クエリはこんな感じ
select max_records.* from (ソート順に連番を付与したテーブル) max_records where max_records.max_num = 1
ソート順に連番を付与したテーブル
「row_number()」のトコ以外は好きにする
select * ,( row_number() over( partition by 「グループにしたいカラム」 order by 「ソート順の指定」 ) ) max_num from xxxx
row_number() over()
「row_number() over()」でワンセットっぽい
▼こんな感じ
row_number() over( partition by 「グループにしたいカラム」 order by 「ソート順の指定」 )
not existsを使う
使いこなせる自信がなく挫折