分析関数は、問い合わせで実行される演算の集合である。結合、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...])
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
部署毎にグルーピングする例を次に示す。
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 でも ROW_NUMBER 関数を使うことができる。
SELECT ROW_NUMBER(), sql OVER(ORDER BY sal), sal FROM emp
MySQL でも ROW_NUMBER 関数を使うことができる。
SQL Server でも ROW_NUMBER 関数を使うことができる。
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 |
---|---|---|---|
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