それでは、ランク付け分析関数を利用して、分析してみましょう。おなじみのSCOTTユーザーが所有するEMP表を使います。
SQL> desc emp 名前 NULL? 型 ----------------------------------------- -------- ------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)
まず、全員の給料(SAL)を高い順にランク付けしてみます。分析関数のRANK関数を使用します。RANK関数の構文は、以下のとおりです。
構文 RANK ( ) OVER ( [query_partition_clause]order_by_clause )
SQL> select ename, sal, rank() over(order by sal desc) rank
from emp;
ENAME SAL RANK
---------- ---------- ----------
KING 5000 1
SCOTT 3000 2
FORD 3000 2
JONES 2975 4
BLAKE 2850 5
CLARK 2450 6
ALLEN 1600 7
TURNER 1500 8
MILLER 1300 9
WARD 1250 10
MARTIN 1250 10
ADAMS 1100 12
JAMES 950 13
SMITH 800 14
14行が選択されました。
RANK関数は、同じ項目の結果がある場合(SCOTTとFORDは、SALが3000で同じ)は、同一の結果(RANK=2)が返ります。次に給料(SAL)が低い(JONES)は、RANK=4が返ります。
同一値でランキング順の結果に抜けを作りたくない場合は、DENSE_RANK関数を使用します。DENSE_RANK関数の構文は、RANK関数と同じです。
構文 DENSE_RANK ( ) OVER( [query_partition_clause] order_by_clause )
SQL> select ename, sal, dense_rank() over(order by sal desc) rank
from emp;
ENAME SAL RANK
---------- ---------- ----------
KING 5000 1
SCOTT 3000 2
FORD 3000 2
JONES 2975 3
BLAKE 2850 4
CLARK 2450 5
ALLEN 1600 6
TURNER 1500 7
MILLER 1300 8
WARD 1250 9
MARTIN 1250 9
ADAMS 1100 10
JAMES 950 11
SMITH 800 12
14行が選択されました。
DENSE_RANK関数は、同じ項目の結果がある場合(SCOTTとFORDは、SALが3000で同じ)は、同一の結果(RANK=2)が返り、次に給料(SAL)が低い(JONES)は、RANK=3が返ります。ゴルフの試合結果は、RANK関数の結果ということになりますね。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.