前後一ヶ月 前後一ヶ月
前後一ヶ月を含めた4行がウィンドウを含めた4行がウィンドウを含めた4行がウィンドウを含めた4行がウィンドウ
【参考:物理ウィンドウと論理ウィンドウについて】
それに対し、「論理ウィンドウ」はカレント行を基準にして「論理範囲で範囲指定」を行います。今回の 例や上図の例では「論理範囲 = 時間(月)による期間」を意味します。上図の例では論理ウィンドウを指 定しているため、「00/04/01」のレコードが2つ存在する場合は、この2行を含めた4行をウィンドウとし て、ウィンドウ関数が適用されます。
Time Ename Sales Balance 00/01/01 Scott 3250 3325 00/02/01 Scott 3400 2900 00/03/01 Scott 2050 2316.67 00/04/01 Scott 1500 2850 00/04/01 Scott 5000 2833.33 00/05/01 Scott 2000 4000 00/06/01 Scott 5000 3500
(参考) 移動平均計算に対するウィンドウの設定
(参考) 移動平均計算に対するウィンドウの設定(参考) 移動平均計算に対するウィンドウの設定
(参考) 移動平均計算に対するウィンドウの設定
ウィンドウ開始点 ウィンドウ開始点 ウィンドウ開始点 ウィンドウ開始点
ウィンドウ終了点 ウィンドウ終了点 ウィンドウ終了点 ウィンドウ終了点
移動平均移動平均
移動平均移動平均に対するウィンドウの場合に対するウィンドウの場合に対するウィンドウの場合に対するウィンドウの場合
↓
↓
↓
↓
開始点および終了点の両方がスライド 開始点および終了点の両方がスライド 開始点および終了点の両方がスライド 開始点および終了点の両方がスライド 一定の物理範囲
一定の物理範囲 一定の物理範囲
一定の物理範囲 or 論理範囲が維持される論理範囲が維持される論理範囲が維持される論理範囲が維持される
【参考:avgを用いた移動平均計算に対するウィンドウの設定】
今回の例のような「移動平均」に対し、どのようにウィンドウを設定すればよいのかを考えます。
まず、社員別に移動平均結果を表示させたいので、「社員」の値で結果セット・パーティションを設けま す。そして、「3ヶ月の移動平均」であれば、ウィンドウの論理間隔を時系列(ここでは月)で設定しま す。3ヶ月の移動平均を求めるとすると、avgが適用されるウィンドウは
- 開始点をカレント行の1ヶ月前に設定する - 終了点をカレント行の1ヶ月後に設定する
→ 該当するレコードをすべて拾うために「論理ウィンドウ」で指定
- 終了点がパーティションの最後にたどり着いた時点で累計計算が終了(もしくはリセット)
→ 社員別に移動平均計算を実行するため という設定を行います。
カレント行は結果セット・パーティションの最初の行から結果セット・パーティションの最後の行までス ライドします。スライドするたびにカレント行にはその時点でのウィンドウを用いて累計計算を行い、結 果をカレント行に格納します。
Oracle Corporation Japan 40
! 売上金額の構成比を表示する 売上金額の構成比を表示する 売上金額の構成比を表示する 売上金額の構成比を表示する
! 売上金額の構成比を表示する 売上金額の構成比を表示する 売上金額の構成比を表示する 売上金額の構成比を表示する
6. 構成比を計算する6. 構成比を計算する 6. 構成比を計算する 6. 構成比を計算する
Scott
売上総計 売上総計 売上総計 売上総計 (1月~8月)(1月~8月)(1月~8月)(1月~8月)売上金額 売上金額 売上金額
売上金額 構成比構成比構成比構成比 00/01/01 3250 0.091 00/02/01 3400 0.095 00/03/01 2050 0.057
00/04/01 5000 0.14
00/05/01 5000 0.14
00/06/01 5000 0.14
00/07/01 8000 0.224 00/08/01 4050 0.113
《6. 構成比を計算する》
この例ではScottさんの1月〜8月までにおける売上金額を構成比として表示しています。
従来、このような前月比較や前年同月比などの表示を行うためには、内部結合やファンクションを用いた 高度なインプリが必要でした。結合処理やファンクション処理による検索パフォーマンスの劣化は前述
「ランキング関数」の場合と同様です。
このような構成比の計算には分析関数である「レポート関数」を使用します。
〔売上総計を表示する例〕
〔売上総計を表示する例〕
〔売上総計を表示する例〕
〔売上総計を表示する例〕
select time,sum(sales) sales,
sum(sum(sales)) over () as total_sales from emp group by time ;
分析関数 分析関数 分析関数
分析関数
(レポート関数)(レポート関数)(レポート関数)(レポート関数)分析関数 分析関数
分析関数 分析関数
(レポート関数)(レポート関数)(レポート関数)(レポート関数)パーティション内における集計・平均・カウントを計算 パーティション内における集計・平均・カウントを計算 パーティション内における集計・平均・カウントを計算 パーティション内における集計・平均・カウントを計算
Time Sales Total_sales 00/01/01 3250 35750 00/02/01 3400 35750 00/03/01 2050 35750 00/04/01 5000 35750 00/05/01 5000 35750 00/06/01 5000 35750 00/07/01 8000 35750 00/08/01 4050 35750
【分析関数(レポート関数)】
レポート関数ではLAG/LEAD関数同様、内部結合を用いることなく対象表の複数行へ同時にアクセスする ことが可能になります。関数群はsum,avg,count,max,min…などがあり、結果セット・パーティションを用い たレポートが可能です。
上記の例ではレポート関数「sum」を使用した売上総計を例に説明しています。この例では結果セット・
パーティションを設けていないため、すべての結果セットに対する売上総計が各レコードに格納されてい ることがわかります。
ここから構成比を求める場合には、各レコードのsalesを総計(total_sales)で割ったものを表示する列を作 れば簡単に表示可能です。
Oracle Corporation Japan 42
Time Sales Total_salesRatio_to_report00/01/01 3250 35750 0.091 00/02/01 3400 35750 0.095 00/03/01 2050 35750 0.057 00/04/01 5000 35750 0.14 00/05/01 5000 35750 0.14 00/06/01 5000 35750 0.14 00/07/01 8000 35750 0.224 00/08/01 4050 35750 0.113
分析関数 分析関数 分析関数
分析関数
(レポート関数)(レポート関数)(レポート関数)(レポート関数)分析関数 分析関数 分析関数
分析関数
(レポート関数)(レポート関数)(レポート関数)(レポート関数)パーティション内における集計・平均・カウントを計算 パーティション内における集計・平均・カウントを計算パーティション内における集計・平均・カウントを計算 パーティション内における集計・平均・カウントを計算
Ratio_to_report関数関数関数関数
値の集合の合計に対する値の 値の集合の合計に対する値の 値の集合の合計に対する値の 値の集合の合計に対する値の 割合(構成比)を計算 割合(構成比)を計算 割合(構成比)を計算 割合(構成比)を計算
〔売上総計に対する値の構成比を表示する例〕
〔売上総計に対する値の構成比を表示する例〕
〔売上総計に対する値の構成比を表示する例〕
〔売上総計に対する値の構成比を表示する例〕
select time,sum(sales) sales,
sum(sum(sales)) over () as total_sales,
ratio_to_report(sum(sales)) over () as ratio_to_report from emp group by time ;
【分析関数(レポート関数)】
さらに、ratio_to_report関数を用いることにより、構成比の値を関数レベルで簡単にインプリできます。当 然、結果セット・パーティションを併用してカテゴリー別構成比を求めることも可能です。
(参考) 分析関数の処理順序について
(参考) 分析関数の処理順序について
(参考) 分析関数の処理順序について
(参考) 分析関数の処理順序について
全ての結合、
全ての結合、
全ての結合、
全ての結合、
WHERE/GROUP BY/HAVING
句句句句結果セット・パーティション作成 結果セット・パーティション作成 結果セット・パーティション作成 結果セット・パーティション作成
分析関数の適用 分析関数の適用 分析関数の適用 分析関数の適用
ORDER BY
句の処理句の処理句の処理句の処理問い合わせに 問い合わせに 問い合わせに
問い合わせにORDER BY句がある場合は句がある場合は句がある場合は句がある場合は 最後に行うことで正確な順序付けが行われる 最後に行うことで正確な順序付けが行われる 最後に行うことで正確な順序付けが行われる 最後に行うことで正確な順序付けが行われる 結合・集計・
結合・集計・
結合・集計・
結合・集計・WHERE句の処理が行われた後に句の処理が行われた後に句の処理が行われた後に句の処理が行われた後に カテゴリー分けを行い、分析関数が適用される カテゴリー分けを行い、分析関数が適用される カテゴリー分けを行い、分析関数が適用される カテゴリー分けを行い、分析関数が適用される
【参考:分析関数の処理順序について】
最後に、分析関数が含まれている問い合わせをOracleがどのような順序で処理していくかについて簡単に 説明します。
① SQL文に存在するWHERE句・GROUP BY句・HAVING句などの結合・集計処理等を最初に処理します。
② これらの実行終了を待って、結果セット・パーティションが作成されます。
作成された結果セット・パーティションを用いて分析関数が適用され、計算が行われます。
③ 最後にORDER BY句を処理して、正確な順序づけを実行します。
Oracle Corporation Japan 44
Time Sales Total_salesRatio_to_report00/07/01 8000 35750 0.224 00/04/01 5000 35750 0.14 00/05/01 5000 35750 0.14 00/06/01 5000 35750 0.14 00/08/01 4050 35750 0.113 00/02/01 3400 35750 0.095 00/01/01 3250 35750 0.091 00/03/01 2050 35750 0.057
〔売上総計に対する値の構成比を表示する例
〔売上総計に対する値の構成比を表示する例
〔売上総計に対する値の構成比を表示する例
〔売上総計に対する値の構成比を表示する例 (構成比の降順ソート)(構成比の降順ソート)(構成比の降順ソート)(構成比の降順ソート)〕〕〕〕 select time,sum(sales) sales,
sum(sum(sales)) over () as total_sales,
ratio_to_report(sum(sales)) over () as ratio_to_report from emp group by time
order by ratio_to_report desc ;
(参考) 分析関数の処理順序について
(参考) 分析関数の処理順序について(参考) 分析関数の処理順序について
(参考) 分析関数の処理順序について
【参考:分析関数の処理順序について】
実際に実行計画を見ながら説明します。
使用するSQL文は、先程のratio_to_report関数を用いた問い合わせを、さらに構成比の高い順にソート処理 を行うSQL文です。