MySQLのRANK()関数とは?順位付けの基本を実例つきで解説
MySQLのRANK()関数とは
MySQLのRANK()関数は、結果セットのパーティション内にある各行に対して順位(ランキング)を割り当てるためのウィンドウ関数です。同じ値を持つ行には同じ順位が付き、その後の順位が飛ばされる(ギャップが生じる)のが大きな特徴です。
なお、RANK()関数はMySQL 8.0以降で利用できる機能です。それ以前のバージョンでは使用できないため、事前にバージョンを確認しておきましょう。
ここからは、実際にテーブルを作成し、RANK()関数の動きを段階的に確認していきます。
ステップ1:サンプルテーブルの作成
まず、順位付けの対象となるシンプルなテーブルを作成します。
mysql> create table RankDemo
-> (
-> id int
-> );
Query OK, 0 rows affected (0.53 sec)「id」というint型カラムを1つだけ持つ「RankDemo」テーブルが作成されました。
ステップ2:レコードの挿入
続いて、テーブルにテストデータを挿入します。あえて重複する値(3)を含めているのがポイントです。
mysql> insert into RankDemo values(1); Query OK, 1 row affected (0.19 sec) mysql> insert into RankDemo values(3); Query OK, 1 row affected (0.12 sec) mysql> insert into RankDemo values(3); Query OK, 1 row affected (0.11 sec) mysql> insert into RankDemo values(4); Query OK, 1 row affected (0.12 sec) mysql> insert into RankDemo values(5); Query OK, 1 row affected (0.17 sec)
ステップ3:登録データの確認
SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。
mysql> select * from RankDemo;
実行結果は以下の通りです。
+------+ | id | +------+ | 1 | | 3 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
5件のレコードが登録されており、「3」が2行存在することが確認できます。
ステップ4:RANK()関数で順位を付ける
それでは、本題であるRANK()関数を適用してみましょう。OVER (ORDER BY id)のようにOVER句と組み合わせることで、idの昇順に基づいた順位を各行に付与できます。
mysql> SELECT
-> id,
-> RANK() OVER (ORDER BY id) AS Ranking
-> FROM RankDemo;実行結果は以下の通りです。
+------+---------+ | id | Ranking | +------+---------+ | 1 | 1 | | 3 | 2 | | 3 | 2 | | 4 | 4 | | 5 | 5 | +------+---------+ 5 rows in set (0.04 sec)
実行結果のポイント
出力結果を見ると、RANK()関数の特徴がよく分かります。
- 値が「3」の2行には、どちらも同じ順位「2」が割り当てられています。
- 同順位が2つあるため、次の「4」の順位は「3」ではなく「4」になっています。これがRANK()関数特有の「順位のギャップ」です。
補足:DENSE_RANK()との違い
似た動作をする関数にDENSE_RANK()があります。DENSE_RANK()の場合は同順位があっても次の順位が飛ばされず、「3」が2つ並んだ後に「4」は「3」という順位になります。連番のように隙間なく順位を付けたい場合はDENSE_RANK()を選ぶとよいでしょう。
このように、RANK()関数を使えばSQLだけで簡単にランキング処理を実現できます。売上ランキングやスコア集計など、順位が必要な場面でぜひ活用してください。
-
MySQLで簡単な関数(CREATE FUNCTION)を作成する方法をわかりやすく解説
MySQLでは、CREATE FUNCTIONコマンドを使用することで、独自の関数を自由に作成できます。本記事では、基本的な構文から実際の動作確認まで、具体例を交えながらステップバイステップで解説します。CREATE FUNCTIONの基本構文MySQLでユーザー定義関数を作成する場合、以下のような構文を使用します。delimiter //DROP FUNCTION if exists yourFunctionName;CREATE FUNCTION yourFunctionName(Parameter1,...N) returns typeBEGIN# 変数の宣言# MySQL文END //
-
MySQLのSELECT文でIF()関数を使う方法【条件分岐の実例付き】
MySQLのIF()関数は、指定した条件に基づいて値を返す関数です。条件が真(TRUE)の場合と偽(FALSE)の場合で、それぞれ異なる値を返すことができ、SELECT文の中で手軽に条件分岐を実現できます。 IF()関数の基本構文 IF()関数の構文は以下の通りです。 SELECT IF(条件, 条件が真の場合に返す値, 条件が偽の場合に返す値) FROM テーブル名; サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable ( Value int ); Query OK, 0 rows a