MySQL の ROW_NUMBER()
ここでは MySQL の ROW_NUMBER() 関数ついてご説明します。
ROW_NUMBER() は MySQL の Version 8.0 以降で使える関数です。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の ROW_NUMBER() 関数の使い方
MySQL の ROW_NUMBER() 関数を使うと、現在の行の行番号を取得することができます。
クエリの結果セットに連番を振りたい時などに便利です。
使い方は ROW_NUMBER() に続けて OVER 句を指定します。
SELECT ROW_NUMBER() [OVER 句]
OVER 句では、PARTITION BY や ORDER BY などが指定できます。
たとえば、カラムA の値の降順で連番を振りたい時は次のように指定します。
SELECT ROW_NUMBER() OVER (ORDER BY カラムA DESC);
ソート順は ASC がデフォルトなので、昇順の時は指定しなくて大丈夫です。
複数のカラムでソートしたい時は、ORDER BY カラムA, カラムB, ... のように指定できます。
また、カラムX の値でグループ分けして、その中でカラム A の値の降順で連番を振りたい時は次のように指定します。
SELECT ROW_NUMBER() OVER (PARTITION BY カラムX ORDER BY カラムA DESC);
こちらも、複数のカラムでグルーピングしたい時は PARTITION BY カラムX, カラムY, ... のように指定できます。
MySQL の ROW_NUMBER() で連番を振る
それでは、実際に ROW_NUMBER() 関数を使って連番を振ってみます。
次のような students テーブルがあります。
ROW_NUMBER() 関数を使って、last_name, first_name の順番で連番を振るには次のようにできます。
SELECT ROW_NUMBER() OVER (ORDER BY last_name, first_name) AS row_no,
student_id,
last_name,
first_name,
gender
FROM students;
[実行結果]
last_name, first_name の順番で row_no に連番が振られていますね。
MySQL の ROW_NUMBER() でグループごとに連番を振る
続いて、ROW_NUMBER() 関数を使ってグループごとに連番を振ってみます。
先ほどの students テーブルのレコードを gender でグループ分けして、グループ内で last_name, first_name の順番で連番を振るには次のようにできます。
SELECT ROW_NUMBER() OVER (PARTITION BY gender ORDER BY last_name, first_name) AS row_no,
student_id,
last_name,
first_name,
gender
FROM students;
[実行結果]
gender でグループ分けされてから、last_name, first_name の順番で row_no に連番が振られています。
以上、MySQL の ROW_NUMBER() 関数ついてご説明しました。