分析関数でグループごとに計算する
前ページの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に特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.