SQL ROW_NUMBER 関数

分析関数は、問い合わせで実行される演算の集合である。結合、WHERE句、GROUP BY句及びHAVING句を実行した後で分析関数が処理される。したがって、WHERE句、GROUP BY句及びHAVING句の中では分析関数は使えない。ORDER BY句の中では分析関数を使用できる。

ROW_NUMBER
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...])

ROW_NUMBER関数を使ったSQLのサンプルを示す。

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 奥田いろは

上位10件を表示する例を示す。

SELECT sal, ordr FROM(SELECT sal, RANK() OVER(ORDER BY sal) FROM emp) WHERE ordr <= 10

PARTITION BY

部署毎にグルーピングする例を次に示す。

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 奥田いろは

PostgreSQL

PostgreSQL でも ROW_NUMBER 関数を使うことができる。

SELECT ROW_NUMBER(), sql OVER(ORDER BY sal), sal FROM emp

MySQL

MySQL でも ROW_NUMBER 関数を使うことができる。

SQL Sever

SQL Server でも 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
ROW_NUMBER、RANK、DENSE_RANKの違い
sal ROW_NUMBER RANK DENSE_RANK
800 1 1 1
950 2 2 2
1250 3 3 3
1250 4 3 3
1300 5 5 4
1500 6 6 5

参考文献

Microsoft (2022) ROW_NUMBER (Transact-SQL) - SQL Server

Amazon Web Services, Inc. (2022) ROW_NUMBER ウィンドウ関数 - Amazon Redshift