ラボ > MySQL:ウィンドウ関数(窓関数)

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 # 連番の一つ目を指定

クエリのメモ

考え方

  1. まず、ソート順に連番を付与したテーブルを用意
  2. 連番の一つ目を取得

クエリはこんな感じ

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を使う

使いこなせる自信がなく挫折