分析関数は、問い合わせで実行される演算の集合である。結合、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 <= 10PostgreSQL でも ROW_NUMBER 関数を使うことができる。
SELECT ROW_NUMBER(), sql OVER(ORDER BY sal), sal FROM empMySQL でも ROW_NUMBER 関数を使うことができる。
SQL Server でも ROW_NUMBER 関数を使うことができる。
Microsoft (2022) ROW_NUMBER (Transact-SQL) - SQL Server
Amazon Web Services, Inc. (2022) ROW_NUMBER ウィンドウ関数 - Amazon Redshift