それでは、ランク付け分析関数を利用して、分析してみましょう。おなじみの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.