RANKは順位を付けるSQL関数である。順位なので、同じ値には同じ順位が付けられる。同じ順位が複数あった場合、その後は順位が飛ばされる。
| DBMS | RANK |
|---|---|
| MySQL | ✗ |
| Oracle | ✓ |
| PostgreSQL | ✗ |
| SQL Server | ✗ |
RANK() OVER(ORDER BY col [,col...])
RANK() OVER(PARTITION BY col [,col...] ORDER BY col [,col...])
RANK関数を使ったSQLのサンプルを示す。
SELECT RANK() OVER(ORDER BY sal), sal FROM emp
次のSQLのように、WHERE句、GROUP BY句及びHAVING句の中でRANK関数を使うと、ORA-30483「ここでウィンドウ・ファンクションは使用できません。」のエラーが発生する。
SELECT RANK() OVER(ORDER BY sal), sal FROM emp WHERE RANK() OVER(ORDER BY sal) <= 10
RANKとDENSE_RANKは共に順位をつける分析関数であるが、値が重複するときの順位のつけかたが異なる。
SELECT sal,
RANK() OVER(ORDER BY sal),
DENSE_RANK() OVER(ORDER BY sal)
FROM emp
| sal | RANK | DENSE_RANK |
|---|---|---|
| 800 | 1 | 1 |
| 950 | 2 | 2 |
| 1250 | 3 | 3 |
| 1250 | 3 | 3 |
| 1300 | 5 | 4 |
| 1500 | 6 | 5 |