• 検索結果がありません。

目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C

N/A
N/A
Protected

Academic year: 2021

シェア "目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C"

Copied!
46
0
0

読み込み中.... (全文を見る)

全文

(1)

! !

Creation Date: Oct. 11, 2000

Last Update: Oct. 11, 2000

Version: 1.0

Oracle8

Oracle8

i

i

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

    

    

    

    

    

    

    

    ~

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

「Oracle8

Oracle8

Oracle8

Oracle8i 

 データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

データウェアハウス機能活用法

   ∼

   ∼

   ∼

   ∼

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

レポーティングに有効な集計関数・分析関数

∼」

∼」

∼」

∼」

【概要】  データウェアハウス(DWH)を構築し、それを活用する形態の1つに「分析結果のレポーティング」  があります。ここでいう「レポーティング」とは、   ランキング・前年同月比・移動平均・累計計算 …etc  など、ビジネス・インテリジェンス(Business Intelligence)には欠かすことの出来ない分析要件が挙げ  られます。  本資料では、Oracle8iで大幅に強化されたデータウェアハウス機能のうち集計関数・分析関数にフォー  カスし、これらの概要と使用方法を、実際の分析要件と照らし合わせながら詳しく解説していきます。 【対象ユーザ】  基本的なRDBMSの知識を持っている方、  DWHを用いたシステム構築に携わる方、  Oracle8iの新機能を学習されたい方

(2)

Oracle Corporation Japan 2

① 集計関数/分析関数とは

① 集計関数/分析関数とは

① 集計関数/分析関数とは

① 集計関数/分析関数とは

② 集計関数/分析関数のパフォーマンス効果

② 集計関数/分析関数のパフォーマンス効果

② 集計関数/分析関数のパフォーマンス効果

② 集計関数/分析関数のパフォーマンス効果

③ ケーススタディ

③ ケーススタディ

③ ケーススタディ

③ ケーススタディ

グループ小計やクロス集計を計算する グループ小計やクロス集計を計算するグループ小計やクロス集計を計算する グループ小計やクロス集計を計算する ランキングを表示する ランキングを表示するランキングを表示する ランキングを表示する 前月比較を表示する 前月比較を表示する前月比較を表示する 前月比較を表示する 累計を計算する 累計を計算する累計を計算する 累計を計算する 移動平均を計算する 移動平均を計算する移動平均を計算する 移動平均を計算する 構成比を計算する 構成比を計算する構成比を計算する 構成比を計算する

目次

目次

目次

目次

【目次】 ① 集計関数/分析関数とは  Oracle8iから新たに追加された集計関数と分析関数について、概要を説明します。 ② 集計関数/分析関数のパフォーマンス効果  ここでは、   「集計関数や分析関数はどれくらい有用なものなのか」   「 いままでのSQL文と比べて何が変わるのか」  について説明します。  特に、アプリケーション開発者の方々が気にされている「検索のパフォーマンス」について  フォーカスし、パフォーマンスの観点から見た集計関数や分析関数の効果を少しだけ紹介します。 ③ ケーススタディ  ここでは、実際の分析要件を例に挙げ、 Oracle8iの集計関数/分析関数でどのようにインプリすれば  よいのかを詳しく解説します。  もし、途中で新しい考え方や用語が出てきた場合には、その場で詳しく解説します。  関数の説明から入り、使用例の紹介で終わる「マニュアル」方式とは若干アプローチが異なりますが、  「まず何をやりたいか」というアプローチから集計・分析関数を学ぶことが出来ます。  Oracleデータベースの製品マニュアルと併せてご一読いただけると幸いです。

(3)

DWHシステムの分析要件で必要とされる計算

システムの分析要件で必要とされる計算

システムの分析要件で必要とされる計算

システムの分析要件で必要とされる計算

 ランキング・移動平均・累計計算 

 ランキング・移動平均・累計計算 

 ランキング・移動平均・累計計算 

 ランキング・移動平均・累計計算 ……etc

   ↓

   ↓

   ↓

   ↓

今までの

今までの

今までの

今までのSQL言語では

言語では

言語では

言語では

高度なプログラミングによるインプリが必要

高度なプログラミングによるインプリが必要

高度なプログラミングによるインプリが必要

高度なプログラミングによるインプリが必要

   ↓

   ↓

   ↓

   ↓

検索パフォーマンスが劣化 検索パフォーマンスが劣化検索パフォーマンスが劣化 検索パフォーマンスが劣化 高度なインプリ知識が必要 高度なインプリ知識が必要高度なインプリ知識が必要 高度なインプリ知識が必要 ヒストグラム・前年同月比: ヒストグラム・前年同月比: ヒストグラム・前年同月比: ヒストグラム・前年同月比:PL/SQLファンクションファンクションファンクションファンクション ランキング: ランキング: ランキング: ランキング:rownum サブトータル: サブトータル: サブトータル: サブトータル:union

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

【集計関数/分析関数とは】 DWHを用いたBusiness Intelligence(BI)システムでは、例えばこのような分析要件が挙げられます。 -商品部門別 トップ10ランキング -毎月の総売上の3ヶ月移動平均 -預金額の累計計算 -利益額の前年同月比       …etc しかし、これらの分析要件を、Oracle8i以前のDBを対象としてインプリしようとすると、上図のような高 度なプログラム能力を要すると共に、複雑な問い合わせとなるために生じる検索パフォーマンスの悪化が 常についてまわります。

(4)

Oracle Corporation Japan 4

〔利点〕

〔利点〕

〔利点〕

〔利点〕

      -    Oracleをターゲットとした主要な分析要件を直接サポートをターゲットとした主要な分析要件を直接サポートをターゲットとした主要な分析要件を直接サポートをターゲットとした主要な分析要件を直接サポート       - 複雑な計算をサーバ側で処理させることが可能 複雑な計算をサーバ側で処理させることが可能 複雑な計算をサーバ側で処理させることが可能 複雑な計算をサーバ側で処理させることが可能     →パフォーマンスとスケーラビリティーが飛躍的に向上     →パフォーマンスとスケーラビリティーが飛躍的に向上    →パフォーマンスとスケーラビリティーが飛躍的に向上     →パフォーマンスとスケーラビリティーが飛躍的に向上       -    SQL開発の簡素化(複雑な開発の簡素化(複雑な開発の簡素化(複雑な開発の簡素化(複雑なSQL文からの解放)文からの解放)文からの解放)文からの解放) Oracle ReportsなどのなどのなどのOracle BIツール製品との組み合わせが可能などの ツール製品との組み合わせが可能ツール製品との組み合わせが可能ツール製品との組み合わせが可能            →→→→ 定型帳票などのアプリケーションに応用できる定型帳票などのアプリケーションに応用できる定型帳票などのアプリケーションに応用できる定型帳票などのアプリケーションに応用できる ANSIにおいて分析関数をにおいて分析関数をにおいて分析関数をにおいて分析関数をSQL規格に加えることを検討中(集計関数はすでに準拠規格に加えることを検討中(集計関数はすでに準拠規格に加えることを検討中(集計関数はすでに準拠規格に加えることを検討中(集計関数はすでに準拠(※)(※)(※)(※))))) (※) (※)(※)

(※) ANSI and ISO proposals for SQL3, a draft standard for enhancements to SQL

集計関数

集計関数

集計関数

集計関数

((((Oracle8i R8.1.5~)~)~)~)

・分析関数

・・

分析関数

分析関数

分析関数

(((( Oracle8i R8.1.6~)~)~)~)

 

 

 

 Oracle RDBMSを対象とした

を対象とした

を対象とした

を対象とした

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされたSQL関数群

関数群

関数群

関数群

集計関数

集計関数

集計関数

集計関数

(((Oracle8i R8.1.5~)( ~)~)~)

・分析関数

・・

分析関数

分析関数

分析関数

((( Oracle8i R8.1.6~)( ~)~)~)

 

 

 

 Oracle RDBMSを対象とした

を対象とした

を対象とした

を対象とした

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされた

 集計・分析計算を強化するためにサポートされたSQL関数群

関数群

関数群

関数群

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

集計関数/分析関数とは

そこで、Oracle8iからBIの分析要件にSQL言語レベルでサポートするために「集計関数」「分析関数」の2 つの機能を提供しています。 「集計関数」はOracle8i R8.1.5、「分析関数」はOracle8i R8.1.6からサポートされています。主な利点は上 図のように、  ・Oracleをターゲットとした主要な分析要件を直接サポート  ・複雑な計算をサーバ処理させることが可能(パフォーマンスが飛躍的に向上)  ・SQL開発の簡素化 などが挙げられます。

Oracle ReportsなどのOracle BIツール製品との組み合わせにより、これまで複雑なインプリが必要だったビ ジネス帳票が簡単に作成できるとともに、パフォーマンスやスケーラビリティも向上します。

(5)

例) 売上

例) 売上

例) 売上

例) 売上Top5

5ランキング

ランキング

ランキング

ランキング

給与トップ5 ランキング 給与トップ5 ランキング 給与トップ5 ランキング 給与トップ5 ランキング 1位 1位 1位 1位 king エンジニアエンジニアエンジニアエンジニア 8000 2位 2位 2位 2位 smith エンジニアエンジニアエンジニアエンジニア 7500 3位 3位 3位 3位 adams マーケティングマーケティングマーケティングマーケティング 5000 4位 4位 4位 4位 clack マーケティングマーケティングマーケティングマーケティング 5000 5位 5位 5位 5位 scott エンジニアエンジニアエンジニアエンジニア 4050

Deptno Ename Gender Salary comm 10 smith 女性女性女性女性 5000 2000 10 blake 女性女性女性女性 3400 1000 20 jones 女性女性女性女性 2050 10 king 男性男性男性男性 8000 3000 20 adams 男性男性男性男性 5000 1400 ::::   :  :  :  :  : : : :  : : : :  : : : : Deptno Dname 10 エンジニアエンジニアエンジニアエンジニア 20 マーケティングマーケティングマーケティングマーケティング  :  :  :  :     :    :    :    : Emp((((14300行)行)行)行) Dept((((4行)行)行)行)

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

【集計関数/分析関数のパフォーマンス効果】 ここでは、集計関数や分析関数を用いるとどのような恩恵を受けるかについて、「検索パフォーマンス」 の観点から比較してみたいと思います。 ここで取り上げる例はEmp表とDept表の結合スキーマを対象とした給与トップ5を検索する場合です。トッ プ5のレポートには「順位数」と「従業員名」・「職種名」・「給与額」が含まれています。

(6)

Oracle Corporation Japan 6

select

e.ename ename,d.dname dname,e.salary salary from emp e, dept d where e.deptno = d.deptno and 5 > ( select count(distinct(salary)) from emp where salary > e.salary )

order by salary desc ;

今までの

今までの

今までの

今までのSQLインプリ例

インプリ例

インプリ例

インプリ例

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

まずは集計関数や分析関数を用いない問い合わせをみてみます。インラインビューを用いて、対象の給与 が全体と比べて5番目以内である場合に表示するようなSQL文です。 ※インラインビュー(Inline View)  スキーマやオブジェクトとは違い、SQL文でビューと同様に使用できる副問い合わせのこと。  基本的にはSelect文に括弧を用いてSelect文を記述する上図のような利用法が一般的である。

(7)

Execution Plan

___________________________________________________

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (ORDER BY) 2 1 FILTER

3 2 NESTED LOOPS

4 3 TABLE ACCESS (FULL) OF ‘EMP’

5 3 TABLE ACCESS (BY INDEX ROWID) OF ‘DEPT’ 6 5 INDEX (UNIQUE SCAN) OF ‘PK_DEPTNO’ (UNIQUE) 7 2 SORT (GROUP BY)

8 7 TABLE ACCESS (FULL) OF ‘EMP’ 実行計画 実行計画 実行計画 実行計画

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

実行計画は次のようになります。 ここでは、EMP表に対して2回のフルスキャンが走っていること表に対して2回のフルスキャンが走っていること表に対して2回のフルスキャンが走っていること表に対して2回のフルスキャンが走っていること、2回のソート処理が実行されている2回のソート処理が実行されている2回のソート処理が実行されている2回のソート処理が実行されている こと こと こと ことがわかります。

(8)

Oracle Corporation Japan 8 Statistics ___________________________________________________ 39984 recursive calls 47185 db block gets 322485 consistent gets 44157 physical reads 0 redo size

521 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2153 sorts (memory) 4998 sorts (disk) 5 rows processed パフォーマンス統計 パフォーマンス統計 パフォーマンス統計 パフォーマンス統計

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

次にパフォーマンス統計(SQL*PlusのAUTOTRACE機能を使用)を取ってみると、アクセスブロック数アクセスブロック数アクセスブロック数アクセスブロック数 ( ( (

(DB BLOCK GETS,CONSISTENT GETS))))やソート回数(やソート回数(やソート回数(やソート回数(SORTS(MEMORY),SORTS(DISK))))の値が大)の値が大の値が大の値が大 きいこと

きいこと きいこと

(9)

select

ename,dname,salary,rank_sal from

(

select e.ename ename,d.dname dname,e.salary salary, rank() over(order by e.salary desc) as rank_sal from emp e,dept d

where e.deptno = d.deptno ) where rank_sal < 6

分析関数を使用した

分析関数を使用した

分析関数を使用した

分析関数を使用した

インプリ例

インプリ例

インプリ例

インプリ例

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

これに対し、分析関数を用いて同じ要件を実現するSQL文は次のようになります。 ここで用いられるrank()が分析関数に当たり、rank()は順位を決定する関数です。

(10)

Oracle Corporation Japan 10

Execution Plan

___________________________________________________

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 VIEW

2 1 WINDOW (SORT PUSHED RANK) 3 2 NESTED LOOPS

4 3 TABLE ACCESS (FULL) OF ‘EMP’

5 3 TABLE ACCESS (BY INDEX ROWID) OF ‘DEPT’ 6 5 INDEX (UNIQUE SCAN) OF ‘PK_DEPTNO’ (UNIQUE) 実行計画 実行計画 実行計画 実行計画 《比較》 《比較》 《比較》 《比較》  ・  ・  ・  ・ EMP表へのフルスキャンの回数が減っている表へのフルスキャンの回数が減っている表へのフルスキャンの回数が減っている表へのフルスキャンの回数が減っている  ・  ・  ・  ・ ソート処理の回数が減っているソート処理の回数が減っているソート処理の回数が減っているソート処理の回数が減っている

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

実行計画は次のようになります。 「分析関数なし」のSQL文(7ページ)と比べて、EMP表のフルスキャンが2回から1回に減っているこ表のフルスキャンが2回から1回に減っているこ表のフルスキャンが2回から1回に減っているこ表のフルスキャンが2回から1回に減っているこ と と と と、ソート処理の回数が2回から1回に減っていることソート処理の回数が2回から1回に減っていることソート処理の回数が2回から1回に減っていることソート処理の回数が2回から1回に減っていることがわかります。

注)ウィンドウ関数によるソート(シート中「WINDOW(SORT PUSHEC RANK)とある部分」)が 『ORDER BY SORT』のアルゴリズムを使用しているため、ここではソート処理としてカウントしていま す。

(11)

Statistics 8 recursive calls 6 db block gets 28682 consistent gets 1 physical reads 0 redo size

917 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 5 rows processed パフォーマンス統計(分析関数使用) パフォーマンス統計(分析関数使用)パフォーマンス統計(分析関数使用) パフォーマンス統計(分析関数使用) Statistics 0 57184 1157984 0 0 830 424 2 14296 0 5 分析関数不使用 分析関数不使用 分析関数不使用 分析関数不使用 《比較》 《比較》 《比較》 《比較》  ・  ・  ・  ・ アクセスブロック数が減少しているアクセスブロック数が減少しているアクセスブロック数が減少しているアクセスブロック数が減少している  ・  ・  ・  ・ ソート処理の回数が少なくて済むソート処理の回数が少なくて済むソート処理の回数が少なくて済むソート処理の回数が少なくて済む パフォーマンスが パフォーマンスが パフォーマンスが パフォーマンスが 改善されている 改善されている 改善されている 改善されている 経過: 経過: 経過: 経過:00:00.91 経過:経過:09:57.70経過:経過:

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

集計関数/分析関数のパフォーマンス効果

さらに、パフォーマンス統計を取ると、分析関数無しの場合との違いがはっきりと現れてきます。 ・アクセスしたブロック数

  DB BLOCK GETS + CONSISTENT GETS

 分析関数不使用と比べて非常に少ないブロック数であることがわかります。  すなわち、同じ結果を得るために57000ものブロック数にアクセスする必要があった検索が、  分析関数を用いることによりアクセスブロック数を減らすことができ、パフォーマンスの向上に  つながります。 ・ソート処理の回数   SORT(MEMORY) + SORT(DISK)  この数値も不使用時に比べて激減していることから、分析関数を用いることによる  検索パフォーマンス向上が見込まれます。 実際、このスキーマに問い合わせを行った結果、上図のような問い合わせ時間になりました。不使用時で は、EMP表1レコード毎にインラインビューの処理が走るためこのような結果になりますが、分析関数で 同じものを実現させた場合は検索時間が大幅に短縮されていることがわかります。

(12)

Oracle Corporation Japan 12  1. グループ小計やクロス集計を計算する  1. グループ小計やクロス集計を計算する  1. グループ小計やクロス集計を計算する  1. グループ小計やクロス集計を計算する  2. ランキングを表示する  2. ランキングを表示する  2. ランキングを表示する  2. ランキングを表示する  3. 前月比較を表示する  3. 前月比較を表示する  3. 前月比較を表示する  3. 前月比較を表示する  4. 累計を計算する  4. 累計を計算する  4. 累計を計算する  4. 累計を計算する  5. 移動平均を計算する  5. 移動平均を計算する  5. 移動平均を計算する  5. 移動平均を計算する  6. 構成比を計算する  6. 構成比を計算する  6. 構成比を計算する  6. 構成比を計算する →  →  →  → ROLLUP/CUBE ( (集計関数) ( (集計関数)集計関数)集計関数) → ランキング関数 → ランキング関数 → ランキング関数 → ランキング関数 (分析関数) (分析関数) (分析関数) (分析関数) →  →  →  → LAG/LEAD関数関数関数関数 (分析関数) (分析関数) (分析関数) (分析関数) → ウィンドウ関数 → ウィンドウ関数 → ウィンドウ関数 → ウィンドウ関数 (分析関数) (分析関数) (分析関数) (分析関数) → ウィンドウ関数 → ウィンドウ関数 → ウィンドウ関数 → ウィンドウ関数 (分析関数) (分析関数) (分析関数) (分析関数) → レポート関数 → レポート関数 → レポート関数 → レポート関数 (分析関数) (分析関数) (分析関数) (分析関数)

ケーススタディ

ケーススタディ

ケーススタディ

ケーススタディ

【ケーススタディ】 ここからは、これら集計関数・分析関数を使用法を解説します。 解説方法は「ケーススタディ」方式となっております。 まず、BIの分析要件としてもっともポピュラーな要件を6つ挙げると上図のようなケースにまとまります。こ れらのケースの対し、どのような関数を用いてインプリしていくのか、またインプリする際に注意すべき点と は何か、について一つずつ解説していきます。 【補足:定型帳簿の例】

(13)

1. グループ小計やクロス集計を計算する 1. グループ小計やクロス集計を計算する1. グループ小計やクロス集計を計算する 1. グループ小計やクロス集計を計算する

Gender Dname Ename SUM(Salary)

女性 女性女性 女性 エンジニアエンジニアエンジニアエンジニア smith 2000 女性 女性女性 女性 マーケティングマーケティングマーケティングマーケティング allen 3000 女性 女性女性 女性 エンジニアエンジニアエンジニアエンジニア ward 5000 女性 女性女性 女性 マーケティングマーケティングマーケティングマーケティング jones 1500 女性 女性女性 女性   :  :  :  :  : : : :  : : : : 女性 女性女性 女性   :  :  :  :  : : : :  : : : : 男性 男性男性 男性 マーケティングマーケティングマーケティングマーケティング scott 12500 男性 男性男性 男性 エンジニアエンジニアエンジニアエンジニア king 12500 女性 女性女性 女性   :  :  :  :  : : : :  : : : : 女性 女性女性 女性   :  :  :  :  : : : :  : : : : 女性総計 女性総計 女性総計 女性総計 女性総計 女性総計女性総計 女性総計 27,50027,500  エンジニア  エンジニア エンジニア  エンジニア 15,000  マーケティング  マーケティング マーケティング  マーケティング 7,500 男性総計 男性総計 男性総計 男性総計 男性総計 男性総計男性総計 男性総計 30,80030,800  エンジニア  エンジニア エンジニア  エンジニア 19,800  マーケティング  マーケティング マーケティング  マーケティング 11,000

! 性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

! 性別・職種のクロス集計

性別・職種のクロス集計

性別・職種のクロス集計

性別・職種のクロス集計

!

性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

性別・職種ごとのグループ小計

!

性別・職種のクロス集計

性別・職種のクロス集計

性別・職種のクロス集計

性別・職種のクロス集計

《1. グループ小計やクロス集計を計算する》 この例では性別・職種毎の給与小計を求めています。「性別・職種」の組み合わせでの小計だけではなく、 「性別」レベルのみの小計や総計などを含めたグループ小計形式や、これらに加え「職種」レベルのみの 小計を加えたクロス集計形式も1つのSQL文で実現しています。 従来、集計計算にはgroup by句を使用してきました。ただし、この場合には小計毎にselect文を書き、union allなどで結果セットを連結して表示する必要がありました。この連結は組み合わせの数が多くなればなる ほど複雑かつ多くなってきます。  (例)「性別・職種」の組み合わせによるグループ小計 → 3つのselect文の連結が必要(「性別・職種」の小計+「性別」の小計+総計)     「性別・職種」の組み合わせによるクロス集計 → 4つのselect文の連結が必要(上記の3つ+「職種」の小計)        :        :     N個の組み合わせによるグループ小計 → N+1個のselect文の連結が必要     N個の組み合わせによるクロス集計 → 2N個のselect文の連結が必要 このような検索には集計関数である「ROLLUP」と「CUBE」の2つの関数を使用します。

(14)

Oracle Corporation Japan 14

集計関数

集計関数

集計関数

集計関数

 従来の  従来の 従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

集計関数

集計関数

集計関数

集計関数

 従来の  従来の 従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

ROLLUP

指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す

CUBE

指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す

ROLLUP

指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す

CUBE

指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す

12500

小計 小計 小計 小計

5000

3000

2000

女性 女性 女性 女性

7500

4500

3000

男性 男性 男性 男性 小計 小計 小計 小計 マーケティング マーケティングマーケティング マーケティング エンジニア エンジニアエンジニア エンジニア Dname Gender 【集計関数について】 集計関数は従来のGROUP BY句からの拡張として位置づけられる演算子です。従って、集計関数を使用す る際にはGROUP BY句を併用することになります。 「ROLLUP」  指定した集計軸に沿ったグループ小計、例えば上図で言えば「性別・職種の組み合わせでの小計」+ 「性別のみの小計」+「総計」の3つを返します。

(15)

集計関数

集計関数

集計関数

集計関数

 従来の  従来の 従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

集計関数

集計関数

集計関数

集計関数

 従来の  従来の 従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

ROLLUP

指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す

CUBE

指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す

ROLLUP

指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す指定した集計軸の並びに沿ったサブ・トータル及び総合計を返す

CUBE

指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す指定した集計軸のクロス集計及び総合計を返す

12500

7500

5000

小計 小計 小計 小計

5000

3000

2000

女性 女性 女性 女性

7500

4500

3000

男性 男性 男性 男性 小計 小計 小計 小計 マーケティング マーケティングマーケティング マーケティング エンジニア エンジニアエンジニア エンジニア Dname Gender 【集計関数について】 「CUBE」  指定した集計軸のクロス集計、例えば上図で言えば「性別・職種の組み合わせでの小計」+「性別のみ の小計」+「職種のみの小計」+「総計」の3つを返します。

(16)

Oracle Corporation Japan 16

Gender Dname SUM(Salary)

女性 女性女性 女性 エンジニアエンジニアエンジニアエンジニア 2000 女性 女性女性 女性 マーケティングマーケティングマーケティングマーケティング 3000 女性 女性女性 女性 5000 男性 男性男性 男性 エンジニアエンジニアエンジニアエンジニア 3000 男性 男性男性 男性 マーケティングマーケティングマーケティングマーケティング 4500 男性 男性男性 男性 7500 12500 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 select gender,dname,sum(salary) from emp,dept

group by rollup (gender,dname);

引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト ① 右 ① 右 ① 右 ① 右 →→ 左の順にレベル付け→左の順にレベル付け左の順にレベル付け左の順にレベル付け ② レベル順に小計を作成 ② レベル順に小計を作成 ② レベル順に小計を作成 ② レベル順に小計を作成 - Genderに対するそれぞれのに対するそれぞれのに対するそれぞれのに対するそれぞれの Dnameにわたって集計にわたって集計にわたって集計にわたって集計 - 各各各各Genderに対して全てのに対して全てのに対して全てのに対して全てのDname にわたって集計 にわたって集計 にわたって集計 にわたって集計 - 総計を計算総計を計算総計を計算総計を計算 第1レベル: 第1レベル: 第1レベル: 第1レベル:dname、、、第2レベル:、第2レベル:第2レベル:gender第2レベル:

集計関数 

集計関数 

集計関数 

集計関数 

〔〔

〔ROLLUP〕〕〕〕

      従来の従来の従来の従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

集計関数 

集計関数 

集計関数 

集計関数 

〔〔

〔ROLLUP〕〕〕〕

      従来の従来の従来の従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子 【集計関数の使用例】 上図は、集計関数を用いて要件を満たすSQL文を書いた例です。ケーススタディでは基本的に  左上の(赤色の)ボックス → SQL文の例  左下の(黒色の)ボックス → 上記SQL文を用いて表示される結果例 となっております。

グループ小計の場合は、Group by句の後にrollupを記述します。そして、 rollupの引数として「グループ化 列の順序づけリスト」を記述する必要があります。このリストに沿って小計を計算していきます。 上図の例では、第1レベルにdname(職種)、第2レベルにgender(性別)を指定しています。従って、 Rollupによる集計は  ① 「性別・職種の組み合わせによる小計」     (性別に対するそれぞれの職種にわたって集計計算)  ② 「性別のみの小計」     (各性別に対する全職種にわたって集計計算)  ③ 「総計」 という順番で処理・表示されます。

(17)

〔性別・職種のクロス集計〕 〔性別・職種のクロス集計〕〔性別・職種のクロス集計〕 〔性別・職種のクロス集計〕 select gender,dname,sum(salary) from emp,dept

group by cube (gender,dname);

引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト 引数:グループ化列の順序づけリスト ① 右 ① 右① 右 ① 右 →→ 左の順にレベル付け→左の順にレベル付け左の順にレベル付け左の順にレベル付け ② レベル順に小計を作成 ② レベル順に小計を作成② レベル順に小計を作成 ② レベル順に小計を作成 - Genderに対する全てのに対する全てのに対する全てのに対する全てのDname にわたって集計 にわたって集計 にわたって集計 にわたって集計 - 各各各各Genderに対して全てのに対して全てのに対して全てのに対して全てのDname にわたって集計 にわたって集計 にわたって集計 にわたって集計 - 各各各各Dnameに対して全てのに対して全てのに対して全てのに対して全てのGender にわたって集計 にわたって集計 にわたって集計 にわたって集計 - 総計を計算総計を計算総計を計算総計を計算 第1レベル: 第1レベル: 第1レベル: 第1レベル:dname、、、、第2レベル:第2レベル:第2レベル:第2レベル:gender

Gender Dname SUM(Salary)

女性 女性 女性 女性 エンジニアエンジニアエンジニアエンジニア 2000 女性 女性 女性 女性 マーケティングマーケティングマーケティングマーケティング 3000 女性 女性 女性 女性 5000 男性 男性 男性 男性 エンジニアエンジニアエンジニアエンジニア 3000 男性 男性 男性 男性 マーケティングマーケティングマーケティングマーケティング 4500 男性 男性 男性 男性 7500 エンジニア エンジニアエンジニア エンジニア 5000 マーケティング マーケティングマーケティング マーケティング 7500 12500

集計関数 

集計関数 

集計関数 

集計関数 

〔〔

〔CUBE〕〕〕〕

      従来の従来の従来の従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

集計関数 

集計関数 

集計関数 

集計関数 

〔〔

〔CUBE〕〕〕〕

      従来の従来の従来の従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子 【集計関数の使用例】

クロス集計の場合は、Group by句の後にcubeを記述します。そして、 rollup同様、cubeの引数として「グルー プ化列の順序づけリスト」を記述する必要があります。このリストに沿ってクロス集計を計算していきま す。 上図の例では、第1レベルにdname(職種)、第2レベルにgender(性別)を指定しています。従って、 cubeによる集計は  ① 「性別・職種の組み合わせによる小計」      (性別に対するそれぞれの職種にわたって集計計算)  ② 「性別のみの小計」      (各性別に対する全職種にわたって集計計算)  ③ 「職種のみの小計」      (各職種に対する全性別にわたって集計計算)  ③ 「総計」 という順番で処理・表示されます。

(18)

Oracle Corporation Japan 18

参考:

参考:

参考:

参考:GROUPING関数

関数

関数

関数

       『全体』を表す『全体』を表す『全体』を表す『全体』を表すNULL値と実際の値と実際の値と実際の値と実際のNULL値を区別する値を区別する値を区別する値を区別する

参考:

参考:

参考:

参考:GROUPING関数

関数

関数

関数

       『全体』を表す『全体』を表す『全体』を表すNULL値と実際の『全体』を表す 値と実際の値と実際の値と実際のNULL値を区別する値を区別する値を区別する値を区別する

Gender Dname SUM(Salary) G D

女性 女性女性 女性 エンジニアエンジニアエンジニアエンジニア 2000 0 0 女性 女性女性 女性 マーケティングマーケティングマーケティングマーケティング 3000 0 0 女性 女性女性 女性 5000 0 1 男性 男性男性 男性 エンジニアエンジニアエンジニアエンジニア 3000 0 0 男性 男性男性 男性 マーケティングマーケティングマーケティングマーケティング 4500 0 0 男性 男性男性 男性 7500 0 1 エンジニア エンジニア エンジニア エンジニア 5000 1 0 マーケティング マーケティング マーケティング マーケティング 7500 1 0 12500 1 1 select gender,dname,sum(salary),grouping(gender) G,grouping(dname) D from emp,dept

group by cube (gender,dname);

引数:グループ化列 引数:グループ化列引数:グループ化列 引数:グループ化列 『全体』を表す 『全体』を表す 『全体』を表す 『全体』を表すNULL値である場合には値である場合には値である場合には値である場合には 『 『『 『1』を返す』を返す』を返す』を返す それ以外は『 それ以外は『 それ以外は『 それ以外は『0』を返す』を返す』を返す』を返す 【GROUPING関数について】 出力例(黒のボックス)にあるとおり、集計関数を用いて小計・総計を表示する際、小計対象ではないグ ループ化列のセルには空白が表示されます。例えば「各性別に対する全職種にわたって集計計算」する場 合には、職種のセルには空白が表示されます。 この空白とNULL値による空白を区別するために、Oracleではgrouping関数を用意しています。この関数を 用いると、  全体を表す空白 → 1  NULL値による空白 → 0 を表示してくれます。 このgrouping関数を使えば、例えば「性別のみの集計と総計だけを表示したい」という要求にはSQL文に  where grouping(gender) = 1 という条件句を付けるだけで対応が可能になります。

(19)

Gender Dname SUM(Salary) 女性 女性女性 女性 エンジニアエンジニアエンジニアエンジニア 2000 女性 女性女性 女性 マーケティングマーケティングマーケティングマーケティング 3000 女性 女性女性 女性 5000 男性 男性男性 男性 エンジニアエンジニアエンジニアエンジニア 3000 男性 男性男性 男性 マーケティングマーケティングマーケティングマーケティング 4500 男性 男性男性 男性 7500 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 〔性別・職種ごとのグループ小計〕 select gender,dname,sum(salary) from emp,dept

group by gender rollup (dname); rollup/cubeの前にレベルを書くと、の前にレベルを書くと、の前にレベルを書くと、の前にレベルを書くと、

そのレベルまでの集計を行い、 そのレベルまでの集計を行い、 そのレベルまでの集計を行い、 そのレベルまでの集計を行い、 それ以降のレベルと総計の それ以降のレベルと総計の それ以降のレベルと総計の それ以降のレベルと総計の 計算を行わない 計算を行わない 計算を行わない 計算を行わない 例では総計の計算が行われない 例では総計の計算が行われない 例では総計の計算が行われない 例では総計の計算が行われない

参考:集計関数に関する

参考:集計関数に関する

参考:集計関数に関する

参考:集計関数に関する Oracle8i R8.1.6の新機能

の新機能

の新機能

の新機能

 従来の  従来の  従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子

参考:集計関数に関する

参考:集計関数に関する

参考:集計関数に関する

参考:集計関数に関する Oracle8i R8.1.6の新機能

の新機能

の新機能

の新機能

 従来の  従来の  従来の  従来の GROUP BY 句から拡張された演算子句から拡張された演算子句から拡張された演算子句から拡張された演算子 ※ ※※ ※ Oracle8i R8.1.6からの新機能からの新機能からの新機能からの新機能 【参考:集計関数に関するOracle8i R8.1.6からの新機能】 Oracle8i R8.1.6から、rollup/cubeの前にレベルを書き込むことが出来ます。上図の例では、第1レベルにdname、第 2レベルにgenderを指定し、第2レベルをrollupの外側に記述しています。 このように記述すると、第2レベルまでの集計、すなわち  ① 「性別・職種の組み合わせによる小計」     (性別に対するそれぞれの職種にわたって集計計算)  ② 「性別のみの小計」     (各性別に対する全職種にわたって集計計算) までは実行し、それ以降のレベル、すなわち  ③ 「総計」 の計算を行わない、という指定が可能になります。 この手法と、groupingによる条件指定により、rollup/cubeを用いた集計計算に様々なバリエーションを与えること が可能になります。 【参考:組み合わせが3つある場合】 例えば、性別・職種の他に地域(Location)がある場合を考えます。この場合、  group by gender,location rollup(dname)

とあった場合は「性別・地域・職種」の小計と「性別・地域」の小計を計算し、これ以降の「性別のみの小計」 と「総計」の計算・表示を省きます。

(20)

Oracle Corporation Japan 20 2. ランキングを表示する 2. ランキングを表示する 2. ランキングを表示する 2. ランキングを表示する 9月度 総合給与ランキング 9月度 総合給与ランキング 9月度 総合給与ランキング 9月度 総合給与ランキング 1位 1位 1位 1位 king 8000 2 2 2 2位位位位 smith 7500 3 3 3 3位位位位 scott 5500 __________________ __________________ __________________ __________________ 4 4 4 4位位位位 adams 5 5 5 5位位位位 clark 6 6 6 6位位位位 allen 7 7 7 7位位位位 turner 8 8 8 8位位位位 jones 9 9 9 9位位位位 blake 10 10 10 10位位位位 martin

! 総合給与ランキング

総合給与ランキング

総合給与ランキング

総合給与ランキング

! 総合給与ランキング 

総合給与ランキング 

総合給与ランキング 

総合給与ランキング (同順位の場合はインセンティブでランク付け)

(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)

! 性別給与ランキング 

性別給与ランキング 

性別給与ランキング 

性別給与ランキング (同順位の場合はインセンティブでランク付け)

(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)

!

総合給与ランキング

総合給与ランキング

総合給与ランキング

総合給与ランキング

!

総合給与ランキング 

総合給与ランキング 

総合給与ランキング 

総合給与ランキング 

(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)

!

性別給与ランキング 

性別給与ランキング 

性別給与ランキング 

性別給与ランキング 

(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け) 9月度 給与ランキング 9月度 給与ランキング 9月度 給与ランキング 9月度 給与ランキング (男性) (男性) (男性) (男性) 1位 1位 1位 1位 king 8000 2 2 2 2位位位位 scottt 5500 3 3 3 3位位位位 adams 5300 ( (( (女性)女性)女性)女性) 1位 1位 1位 1位 smith 7500 2 2 2 2位位位位 allen 5000 3 3 3 3位位位位 jones 4600 《2. ランキングを表示する》 この例では給与の高い順に総合ランキングを表示しています。さらに、総合ランキングだけでははなく、 性別の給与トップ3ランキングというような細かい指定のランキングを表示します。 従来、ランキングの数字を表示するためにはrownumなどの高度な関数が必要でした。さらに上位(下位) N件表示という要求には、インラインビューやファンクションを用いて複雑なインプリを行う必要があり ました。当然、これらの手法には検索パフォーマンスの劣化がついてまわります。 このようなランキング検索には分析関数である「rank」という関数を使用します。

(21)

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数)

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数) データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、レコードのランクレコードのランクレコードのランクレコードのランクを計算するを計算するを計算するを計算する 〔総合給与ランキング〕 〔総合給与ランキング〕〔総合給与ランキング〕 〔総合給与ランキング〕 select ename,gender,salary,comm,

rank () over (order by sal desc) as rank_sal

from emp ;

Ename Gender Salary comm rank_sal

king 男性男性男性男性 8000 3000 1 smith 女性女性女性女性 5000 2000 2 adams 男性男性男性男性 5000 1400 2 clark 男性男性男性男性 5000 1000 2 scott 男性男性男性男性 4050 1200 5 blake 女性女性女性女性 3400 1000 6 allen 女性女性女性女性 3250 500 7 turner 男性男性男性男性 2500 8 jones 女性女性女性女性 2050 9 ward 女性女性女性女性 2000 10 martin 女性女性女性女性 1500 11 【分析関数(ランキング関数)】 ランキング関数「rank」は、検索データセットのレコードに対し、レコードのランキングの数を割り振る ことができます。 上図にある使用例のうち、「over」から始まる引数により、「どの列を対象にランク付けするか」「昇順 か降順か」という指定を行うことが出来ます。 - order by ……   この句の後に来る列名を元にランク付けを行います。   ASC/DESCによる昇順・降順設定も可能です。 この例では、sal(給与)の高い順(降順)にランク付けを行う設定を行っています。

(22)

Oracle Corporation Japan 22

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数)

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数)

Ename Gender Salary comm rank_sal

king 男性男性男性男性 8000 3000 1 smith 女性女性女性女性 5000 2000 2 adams 男性男性男性男性 5000 1400 3 clark 男性男性男性男性 5000 1000 4 scott 男性男性男性男性 4050 1200 5 blake 女性女性女性女性 3400 1000 6 allen 女性女性女性女性 3250 500 7 turner 男性男性男性男性 2500 8 jones 女性女性女性女性 2050 9 ward 女性女性女性女性 2000 10 martin 女性女性女性女性 1500 11 最初の式で同じ値が解決できない 最初の式で同じ値が解決できない最初の式で同じ値が解決できない 最初の式で同じ値が解決できない 2番目の式を用いて解決 2番目の式を用いて解決 2番目の式を用いて解決 2番目の式を用いて解決 データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、レコードのランクレコードのランクレコードのランクレコードのランクを計算するを計算するを計算するを計算する 〔総合給与ランキング  〔総合給与ランキング 〔総合給与ランキング  〔総合給与ランキング (同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け) 〕〕〕〕 select ename,gender,salary,comm,

rank () over (order by sal desc, comm desc) as rank_sal

from emp ; 【分析関数(ランキング関数)】 さらに、順序付けには第2候補・第3候補‥‥というような設定を行うことも可能です。 上図の例で言うと、第1候補としてsal(給与)の高い順(DESC)で順位付けを行い、もし同値のレコー ドが複数現れた場合にはcomm(インセンティブ)の高い順(DESC)で細かい順序づけを行うように指定 しています。

(23)

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数)

分析関数

分析関数

分析関数

分析関数

(ランキング関数)(ランキング関数)(ランキング関数)(ランキング関数) データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、 データセットのレコードに対し、レコードのランクレコードのランクレコードのランクレコードのランクを計算するを計算するを計算するを計算する

Ename Gender Salary comm rank_sal

smith 女性女性女性女性 5000 2000 1 blake 女性女性女性女性 3400 1000 2 allen 女性女性女性女性 3250 500 3 jones 女性女性女性女性 2050 4 ward 女性女性女性女性 2000 5 martin 女性女性女性女性 1500 6 king 男性男性男性男性 8000 3000 1 adams 男性男性男性男性 5000 1400 2 clark 男性男性男性男性 5000 1000 3 scott 男性男性男性男性 4050 1200 4 turner 男性男性男性男性 2500 5 partition by オプションによってオプションによってオプションによってオプションによって rank が操作するグループにデーが操作するグループにデーが操作するグループにデーが操作するグループにデー タセットが分割される タセットが分割されるタセットが分割される タセットが分割される グループが変更されるたび グループが変更されるたび グループが変更されるたび グループが変更されるたび ランクがリセットされる ランクがリセットされるランクがリセットされる ランクがリセットされる 〔性別給与ランキング  〔性別給与ランキング  〔性別給与ランキング  〔性別給与ランキング (同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け)(同順位の場合はインセンティブでランク付け) 〕〕〕〕 select ename,gender,salary,comm,

rank () over (partition by gender

order by sal desc, comm desc) as rank_sal

from emp ; 性別によってカテゴリー分け 性別によってカテゴリー分け 性別によってカテゴリー分け 性別によってカテゴリー分け ↓ ↓ ↓ ↓ カテゴリー別にランク表示 カテゴリー別にランク表示 カテゴリー別にランク表示 カテゴリー別にランク表示 【分析関数(ランキング関数)】 - partition by ….   引数にこの句を指定すると、パーティション(後述参照のこと)により結果セットが分割され、その セット内で順位付けが実行されます。 上図の例で言うと、partition by genderにより「性別のランキング」が実現します。男性の結果セットでラン ク付けを行い、女性の結果セットになるとランク付けをリセットします。

(24)

Oracle Corporation Japan 24 (参考) 結果セット・パーティションについて

(参考) 結果セット・パーティションについて (参考) 結果セット・パーティションについて (参考) 結果セット・パーティションについて

Ename Gender Salary smith 女性女性女性女性 5000 allen 女性女性女性女性 3250 ward 女性女性女性女性 2000 jones 女性女性女性女性 2050 martin 女性女性女性女性 1500 blake 女性女性女性女性 3400 clark 男性男性男性男性 5000 scott 男性男性男性男性 4050 king 男性男性男性男性 8000 turner 男性男性男性男性 2500 adams 男性男性男性男性 1000 select ename,gender,salary from emp 【参考:結果セット・パーティションについて】 結果セットパーティションは、分析関数のみに有効な考え方です。Oracleのテーブル等で使用するパーティのテーブル等で使用するパーティのテーブル等で使用するパーティのテーブル等で使用するパーティ ションとは全く異なるものですのでご注意ください。 ションとは全く異なるものですのでご注意ください。 ションとは全く異なるものですのでご注意ください。 ションとは全く異なるものですのでご注意ください。 上図はパーティションがない普通のselect文と、その結果表示例を示しています。問い合わせにより得たデー タの集まりをここでは「結果セット」と呼びます。

(25)

Ename Gender Salary max_sal smith 女性女性女性女性 5000 5000 allen 女性女性女性女性 3250 5000 ward 女性女性女性女性 2000 5000 jones 女性女性女性女性 2050 5000 martin 女性女性女性女性 1500 5000 blake 女性女性女性女性 3400 5000 clark 男性男性男性男性 5000 8000 scott 男性男性男性男性 4050 8000 king 男性男性男性男性 8000 8000 turner 男性男性男性男性 2500 8000 adams 男性男性男性男性 1000 8000 問い合わせ結果セットを分析関数 問い合わせ結果セットを分析関数 問い合わせ結果セットを分析関数 問い合わせ結果セットを分析関数 によって分割した行グループのこと によって分割した行グループのこと によって分割した行グループのこと によって分割した行グループのこと Oracleの表のパーティションとは異の表のパーティションとは異の表のパーティションとは異の表のパーティションとは異 なることに注意する なることに注意する なることに注意する なることに注意する

結果セット・パーティション

結果セット・パーティション

結果セット・パーティション

結果セット・パーティション

select ename,gender,salary,

max(salary) over(partition by gender) as max_sal

from emp (参考) 結果セット・パーティションについて (参考) 結果セット・パーティションについて (参考) 結果セット・パーティションについて (参考) 結果セット・パーティションについて 【参考:結果セット・パーティションについて】 上図の例で言うと、overの後にくる引数にpartition by ….と記述すると、この句の後にくる列名により結果 セットが論理的に分割されます。この論理的区切りは分析関数を適用する際に関わってきます。 例ではgender(性別)によって分割されてたパーティションに対し分析関数maxが適用されるため、性別毎 に異なる結果が帰ってきます(maxにより、男女別の最大値がレコードに表示されています。maxについて は後述「レポート関数」をご参照ください)。

参照

関連したドキュメント

「男性家庭科教員の現状と課題」の,「女性イ

【ヒアリング要旨】 地域女性ネット高岡のメンバーに聞く

1392例目 大阪府 30代 女性. 1393例目 京都府

政治エリートの戦略的判断とそれを促す女性票の 存在,国際圧力,政治文化・規範との親和性がほ ぼ通説となっている (Krook

スペイン中高年女性の平均時間は 8.4 時間(標準偏差 0.7)、イタリア中高年女性は 8.3 時間(標準偏差

男性収入: 2,436,347 円(月額: 203,029 ) 女性収入: 2,139,510 円(月額: 178,292