SQLクリニック(8) Page 3/3

極めよう! 分析関数によるSQL高速化計画


株式会社インサイトテクノロジー
中島 益次郎
2005/9/27

分析関数でグループごとに計算する

 前ページのSQL文は、EMP表すべて(集合)を1つのグループと見なして、分析を行いました。次は、EMP表の各JOB(職種)別に給料(SAL)が高い順にランキングしてみましょう。

SQL> select ename, job, sal
          , rank() over(partition by job order by sal desc) rank
       from emp ;

ENAME      JOB              SAL       RANK
---------- --------- ---------- ----------
SCOTT      ANALYST         3000          1
FORD       ANALYST         3000          1
MILLER     CLERK           1300          1
ADAMS      CLERK           1100          2
JAMES      CLERK            950          3
SMITH      CLERK            800          4
JONES      MANAGER         2975          1
BLAKE      MANAGER         2850          2
CLARK      MANAGER         2450          3
KING       PRESIDENT       5000          1
ALLEN      SALESMAN        1600          1
TURNER     SALESMAN        1500          2
WARD       SALESMAN        1250          3
MARTIN     SALESMAN        1250          3

14行が選択されました。

リスト3 JOB(職種)ごとにグループに分け給料(SAL)を高い順にランク付け

 このSQL文は、EMP表すべて(集合)をJOBごとのグループに分けて、分析を行っています。SQL文を見れば分かるように、RANK関数でPARTITION BY句を記述することで、集合をどのようなグループに分けて分析を行うかを指定できます。RANK関数で使用しているORDER BY句は、分けられたグループをどのカラムで昇順・降順にランク付けを行うかを指定します。分析関数がどのように処理されるのかを理解しておけば、分析関数の構文も覚えやすいですね。

 分析関数を使用しない方法で、SQL文を記述しようと思うと、大変です。JOBごとにUNION ALLでSALのORDER BYを副問い合わせで記述することになります。RANK関数だけからでも、分析関数で問い合わせ処理の向上と開発作業の向上のメリットがあることを理解してもらえたと思います。

 今回は、「分析関数とは」から始まり、実際に分析関数の1つであるRANK関数(DENSE_RANK関数)の説明を行いました。次回は、さらにいろいろな分析関数について解説する予定です。(次回に続く)

筆者プロフィール
株式会社インサイトテクノロジー
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。中島 益次郎はパフォーマンスで悩めるユーザーのためにPerformance Insightの開発に全力を注ぎ込む熱き魂の開発者。

  3/3  

 Index
連載 SQLクリニック(8)
極めよう! 分析関数によるSQL高速化計画
  Page 1
・分析関数の基本を理解しよう
  Page 2
・分析関数を使ってみる
Page 3
・分析関数でグループごとに計算する


SQLクリニック

TechTargetジャパン

Database Expert フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH