分析関数は、問い合わせで実行される演算の集合である。結合、WHERE句、GROUP BY句及びHAVING句を実行した後で分析関数が処理される。したがって、WHERE句、GROUP BY句及びHAVING句の中では分析関数は使えない。ORDER BY句の中では分析関数を使用できる。
| DBMS | ROW_NUMBER |
|---|---|
| MySQL | ✓ |
| Oracle | ✓ |
| PostgreSQL | ✓ |
| SQL Server | ✓ |
OracleデータベースのROW_NUMBER関数は、検索結果レコードに1から始まる順番を付ける関数である。OVER関数と共に用いて、上位 n 位や下位 n 位のレコードを選択する場合に使われる。
ROW_NUMBER() OVER(ORDER BY col [,col...])
ROW_NUMBER() OVER(PARTITION BY col [,col...] ORDER BY col [,col...])
給料が高い順に行番号をつける例を以下に示す。
SQL> SELECT ROW_NUMBER() OVER(ORDER BY sal DESC) AS rn, sal, deptno, ename FROM emp;
RN SAL DEPTNO ENAME
-- --- ------ ----------
1 200 1 井上和
2 190 2 一ノ瀬美空
3 180 1 菅原咲月
4 170 2 小川彩
5 160 1 冨里奈央
6 150 2 奥田いろは
部署毎にグルーピングして、給料が高い順に行番号をつける例を以下に示す。
SQL> SELECT ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rn, sal, deptno, ename FROM emp;
RN SAL DEPTNO ENAME
-- --- ------ ----------
1 200 1 井上和
2 180 1 菅原咲月
3 160 1 冨里奈央
1 190 2 一ノ瀬美空
2 170 2 小川彩
3 150 2 奥田いろは
上位10件を表示する例を示す。
同じ値があったとき、ROW_NUMBER 関数はそれぞれ異なる行番号をつける。
同じ値の扱いは、ROW_NUMBER、RANK、DENSE_RANK で異なる。それぞれの違いを以下に示す。
SELECT sal,
ROW_NUMBER() OVER(ORDER BY sal),
RANK() OVER(ORDER BY sal),
DENSE_RANK() OVER(ORDER BY sal)
FROM emp
| sal | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 10 | 1 | 1 | 1 |
| 20 | 2 | 2 | 2 |
| 30 | 3 | 3 | 3 |
| 30 | 4 | 3 | 3 |
| 40 | 5 | 5 | 4 |
| 50 | 6 | 6 | 5 |
SELECT sal, ordr FROM(SELECT sal, RANK() OVER(ORDER BY sal) FROM emp) WHERE ordr <= 10
PostgreSQL でも ROW_NUMBER 関数を使うことができる。
SELECT ROW_NUMBER(), sql OVER(ORDER BY sal), sal FROM emp
MySQL でも ROW_NUMBER 関数を使うことができる。
SQL Server でも ROW_NUMBER 関数を使うことができる。
Microsoft (2022) ROW_NUMBER (Transact-SQL) - SQL Server
Amazon Web Services, Inc. (2022) ROW_NUMBER ウィンドウ関数 - Amazon Redshift