がんふぃーるど室長の不定期ブログ

ただいま助手と悪戦苦闘中!

目次

Blog 利用状況

ニュース


自己紹介

名前:がんふぃーるど
肩書:室長
種別:人間・男
資格一覧:
MCP 70-215 Installing, Configurating, and Administering Microsoft Windows 2000 Server
MCTS .NET Framework 2.0 - Distributed Applications
MCTS .NET Framework 2.0 - Web Applications

犬紹介


名前:なうら
肩書:助手
種別:犬・狆・メス
誕生日:2006/7/9
特技:鼻水飛ばし、甘噛、奇襲・急襲・強襲、そそう、お手、お座り、待て

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

ウィンドウ関数(分析関数) - Oracle

WNDPROCとかじゃアリマセン。集権関数とちょっと勘違いされそうなモノなんですが、別物です。ひそかにANSI SQLでも定義されている立派な標準SQL構文です。

ウィンドウ関数とは

簡単に言うと「Group byの様にデータのグループを決められる。集計はせず、さらにその範囲の中で特定のデータのみを対象とできる」ものです。

う~ん、いまいち訳分かりませんね。

とりあえず、使ってみましょう。

ウィンドウ関数を使ってみる

OracleのHRスキーマを使用して、ウィンドウ関数を使ってみます。やりたいことは次の通り。

  • Employeesテーブルの中で、部署(Department_id)ごとに給料の高い順にランク付けする。
  • ランク付けしたら、部署の中で何人中何位だったわかるようにする。
  • 取得する項目は、Employee_id, 名前, 順位, 部署の人数

部署の人数などは、EmployeesテーブルをDepartment_idでgroup byした結果をさらにEmployeesテーブルのDepartment_idと結合してたり…なんてことでも取れますが、そんな面倒なことをしなくてもウィンドウ関数を使えば楽勝です。

SELECT
a.EMPLOYEE_ID,
a.FIRST_NAME || ', ' || a.LAST_NAME ,
a.DEPARTMENT_ID,
RANK() OVER (PARTITION BY a.DEPARTMENT_ID ORDER BY a.SALARY DESC),
COUNT(a.DEPARTMENT_ID) OVER (PARTITION BY a.DEPARTMENT_ID)
FROM
HR.EMPLOYEES a

ポイントは5行目と6行目。

関数(expr) OVER (PARTITION BY XXX)

というのが、ウィンドウ関数の基本的な構文です。PARTITION BY のXXXX項目でグループを指定します(group byみたいな感じ)

5行目では、部署(Department_id)別にウィンドウを設定し、給料の高い順にランク付けします。6行目では、部署別にカウントを取ります。

これだけで完了。実行計画もすっきり。

SELECT STATEMENT
    WINDOW SORT 
        TABLE ACCESS FULL EMPLOYEES

毎回毎回使うようなものではありませんが、かゆい所に手が届くといった感じで結構便利です。

参考文献

Oracle Database SQL リファレンス 10.2 - 分析ファンクション

CodeZine - 分析関数の衝撃

投稿日時 : 2008年7月29日 0:35

コメントを追加

# ウィンドウ関数(分析関数) - SQL Server 2005 2008/07/31 0:57 がんふぃーるど室長の不定期ブログ

ウィンドウ関数(分析関数) - SQL Server 2005

タイトル  
名前  
URL
コメント