Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【MySQL】テーブルの特定の列の値で順位付けを行う

rank関数かdense_rank関数を使う。両関数は動作が異なり、rank関数は指定の列の値に同じ値があった場合は同位としてその次の順位を飛ばすが、dense_rank関数は同じ値があった場合は同位として次の順位は飛ばさない。両関数は指定された列の値に基づいて順位付けを行う。順位付けのデフォルトは昇順のため、これを降順にしたい場合は列を指定する際にdescを指定する。

mysql> select * from temptb;
+------+
| no   |
+------+
|   20 |
|   20 |
|   30 |
|   10 |
|   40 |
+------+
5 rows in set (0.00 sec)
mysql> select no,
    -> rank() over (order by no) as rankno,
    -> dense_rank() over (order by no) as drankno
    -> from temptb;
+------+--------+---------+
| no   | rankno | drankno |
+------+--------+---------+
|   10 |      1 |       1 |
|   20 |      2 |       2 |
|   20 |      2 |       2 |
|   30 |      4 |       3 |
|   40 |      5 |       4 |
+------+--------+---------+
5 rows in set (0.00 sec)
mysql> select no,
    -> rank() over (order by no desc) as rankno,
    -> dense_rank() over (order by no desc) as drankno
    -> from temptb;
+------+--------+---------+
| no   | rankno | drankno |
+------+--------+---------+
|   40 |      1 |       1 |
|   30 |      2 |       2 |
|   20 |      3 |       3 |
|   20 |      3 |       3 |
|   10 |      5 |       4 |
+------+--------+---------+
5 rows in set (0.00 sec)