極めよう! 分析関数によるSQL高速化計画SQLクリニック(8)(2/3 ページ)

» 2005年09月27日 00時00分 公開
[中島益次郎株式会社インサイトテクノロジー]

分析関数を使ってみる

 それでは、ランク付け分析関数を利用して、分析してみましょう。おなじみの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行が選択されました。
リスト1 分析関数のRANK関数を使用し、全員の給料(SAL)を高い順にランク付け

 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行が選択されました。
リスト2 分析関数のDENSE_RANK関数を使用し、全員の給料(SAL)を高い順にランク付け

 DENSE_RANK関数は、同じ項目の結果がある場合(SCOTTとFORDは、SALが3000で同じ)は、同一の結果(RANK=2)が返り、次に給料(SAL)が低い(JONES)は、RANK=3が返ります。ゴルフの試合結果は、RANK関数の結果ということになりますね。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。