分析ビュー式

分析ビュー式を使用すると、分析ビューの定義内、または分析ビューから選択する問合せに計算済メジャーを作成できます。

分析ビュー式は、表や列ではなく、階層および分析ビューの要素を参照する点で他のタイプの式とは異なります。

分析ビュー式は次のいずれかです。

  • av_meas_expression (これは分析ビューのメジャーに基づいています)

  • av_hier_expression (これは関連メンバーの属性値を戻します)

分析ビュー式は、CREATE ANALYTIC VIEW文のcalc_measure_clause、およびSELECT文のWITH句またはFROM句で、calc_meas_expressionパラメータとして使用できます。

計算済メジャーを定義する場合は、次のタイプの式を使用することもできます。

  • 単純

  • CASE

  • 複合

  • 日時

  • 期間

ヒント:

計算済メジャーを使用する分析ビューを作成するSQLスクリプトは、Oracle Live SQLのWebサイト(https://livesql.oracle.com/apex/livesql/file/index.html)で表示および実行できます。このWebサイトには、分析ビューの作成方法および使用方法を示すスクリプトおよびチュートリアルが用意されています。

構文

av_meas_expression::=

lead_lag_expression::=

lead_lag_function_name::=

lead_lag_clause::=

window_expression::=

preceding_boundary ::=

following_boundary::=

rank_function_name::=

rank_function_name.epsの説明が続きます
図rank_function_name.epsの説明

calc_meas_order_by_clause::=

share_of_expression::=

member_expression::=

level_member_literal::=

pos_member_keys::=

named_member_keys::=

hier_navigation_expression::=

hier_ancestor_expression::=

hier_parent_expression::=

hier_lead_lag_expression::=

hier_lead_lag_clause::=

qdr_expression::=

av_hier_expression::=

av_hier_expression.epsの説明が続きます
図av_hier_expression.epsの説明

hier_function_name::=

hier_function_name.epsの説明が続きます
図hier_function_name.epsの説明

セマンティクス

av_meas_expression

関連するメジャー値を検索するために、階層ナビゲーションを実行する式。

lead_lag_expression

階層内で、LEAD操作またはLAG操作を指定して、ある数のメンバー分だけ前後にナビゲートして、関連するメジャー値を検索する式。

calc_meas_expressionパラメータは、lead_lag_expressionによって作成される新しいコンテキストで評価されます。このコンテキストには、指定される階層のメンバーが、LEAD操作またはLAG操作によって指定された関連するメンバーに変更される以外は、外部コンテキストと同じメンバーが含まれます。LEADファンクションまたはLAGファンクションは、lead_lag_clauseパラメータで指定された階層メンバーに対して実行されます。

lead_lag_function_name

LEADファンクションまたはLAGファンクションは、次のいずれかになります。

  • LAGでは、先行するメンバーのメジャー値を戻します。

  • LAG_DIFFでは、現在のメンバーのメジャー値と先行するメンバーのメジャー値との差を戻します。

  • LAG_DIFF_PERCENTでは、現在のメンバーのメジャー値と先行するメンバーのメジャー値との相違率を戻します。

  • LEADでは、後続のメンバーのメジャー値を戻します。

  • LEAD_DIFFでは、現在のメンバーのメジャー値と後続のメンバーのメジャー値との差を戻します。

  • LEAD_DIFF_PERCENTでは、現在のメンバーのメジャー値と後続のメンバーのメジャー値との相違率を戻します。

lead_lag_clause

評価する階層およびオフセット値を指定します。lead_lag_clauseのパラメータは次のとおりです。

  • HIERARCHY hierarchy_refでは、分析ビューで定義されている階層の別名を指定します。

  • OFFSET offset_exprでは、数値に変換するcalc_meas_expressionを指定します。数値は、現在のメンバーから前後に何メンバー分移動するかを指定します。レベル内のメンバーの順序は、階層で使用する属性ディメンションの定義によって決まります。

  • WITHIN LEVELでは、現在のメンバーと深さのレベルが同じメンバー内で、メンバーのオフセット数に従って前後に移動して、関連するメンバーを検索することを指定します。レベル内のメンバーの順序は、階層で使用する属性ディメンションの定義によって決まります。

    WITHIN LEVELキーワードとACROSS ANCESTOR AT LEVELキーワードのどちらも指定されていない場合は、WITHIN LEVEL操作がデフォルトとなります。

  • WITHIN PARENTでは、現在のメンバーと親が同じメンバー内で、メンバーのオフセット数に従って前後に移動して、関連するメンバーを検索することを指定します。

  • ACROSS ANCESTOR AT LEVEL level_refでは、level_refで指定されたレベルの現在のメンバーの祖先(または祖先が存在しない場合はメンバー自体)までナビゲートして関連するメンバーを検索することを指定し、かつ、その親内の各祖先メンバー(メンバー自体を含む)の位置を示します。level_refパラメータは、指定された階層のレベルの名前です。

    祖先メンバーが見つかると、ナビゲーションは、祖先メンバーと深さが同じメンバー内で、メンバーのオフセット数だけ前後に移動します。関連する祖先が見つかった後、ナビゲーションはそのメンバーから階層を逆方向に進み、上に向かって記録された(逆順)親内の位置を照合します。親内での位置は、POSITION FROM BEGINNINGPOSITION FROM ENDのいずれが指定されているかに従い、最初の子または最後の子からオフセットされます。デフォルト値はPOSITION FROM BEGINNINGです。レベル内のメンバーの順序は、階層で使用する属性ディメンションの定義によって決まります。

window_expression

window_expressionでは、現在のメンバーから始まる指定された範囲内にあり、かつ、現在のメンバーと同じ深さにある一連のメンバーを選択します。WITHIN句を使用して階層関係を指定することによって、このメンバーの選択をさらに制限できます。その後、選択したメジャー値で集計が実行され、式に対する1つの結果が生成されます。

window_expressionのパラメータは次のとおりです。

  • aggregate_functionは、COLLECTGROUP_IDGROUPINGGROUPING_IDSYS_XMLAGGXMLAGGおよびすべての複数引数ファンクションを除く、任意の既存のSQL集計ファンクションです。ユーザー定義集計ファンクションも使用できます。集計ファンクションの引数はcalc_meas_expression式です。これらの式は、外部コンテキストを使用して評価され、指定された階層のメンバーは、関連する範囲の各メンバーに変更されます。このため、それぞれの式引数は関連するメンバーごとに1回評価されます。その後、結果が、aggregate_functionを使用して集計されます。

  • OVER (window_clause)では、使用する階層および考慮するウィンドウの境界を指定します。

window_clause

window_clauseパラメータでは、現在のメンバーに関連するメンバーの範囲を選択します。この範囲は、preceding_boundaryパラメータまたはfollowing_boundaryパラメータで指定されたメンバーの間になります。範囲は、常に、現在のメンバーと同じレベルのメンバーに対して計算されます。

window_clauseのパラメータは次のとおりです。

  • HIERARCHY hierarchy_refでは、分析ビューで定義されている階層の別名を指定します。

  • BETWEEN preceding_boundaryまたはfollowing_boundaryでは、現在のメンバーに関連する一連のメンバーを定義します。

  • WITHIN LEVELでは、現在のレベルのすべてのメンバーにboundary句を適用することによって、関連するメンバーを選択します。これは、WITHINキーワードが指定されていない場合にデフォルトとなります。

  • WITHIN PARENTでは、現在のメンバーと親を共有するすべてのメンバーにboundary句を適用することによって、関連するメンバーを選択します。

  • WITHIN ANCESTOR AT LEVELでは、現在のメンバーと指定されたレベルの祖先を共有する(またはメンバー自体である)現在の深さのすべてのメンバーにboundary句を適用することによって、関連するメンバーを選択します。現在のメンバーが指定されたレベルよりも上にある場合、ウィンドウ式の値はNULLとなります。指定された階層に、このレベルがない場合は、エラーが発生します。

preceding_boundary

preceding_boundaryパラメータではメンバーの範囲を定義し、その先頭は、現在のメンバーのレベルで、指定された数だけ戻ったメンバーとなり、末尾は指定された境界の端となります。次のパラメータでは、範囲を指定します。

  • UNBOUNDED PRECEDINGを指定すると、レベルの最初のメンバーが範囲の先頭になります。

  • offset_expr PRECEDINGを指定すると、現在のメンバーからoffset_exprの数だけ戻ったメンバーが範囲の先頭になります。offset_expr式は、数値に変換するcalc_meas_expressionです。オフセット数が、そのレベルの現在のメンバーから最初のメンバーまでのメンバーの数より大きい場合、最初のメンバーが範囲の開始点として使用されます。

  • CURRENT MEMBERを指定すると、現在のメンバーが範囲の末尾となります。

  • offset_expr PRECEDINGを指定すると、現在のメンバーからoffset_exprだけ戻ったメンバーが範囲の末尾になります。

  • offset_expr FOLLOWINGを指定すると、現在のメンバーからoffset_expr分だけ進んだメンバーが範囲の末尾になります。

  • UNBOUNDED FOLLOWINGを指定すると、そのレベルの最後のメンバーが範囲の末尾になります。

following_boundary

following_boundaryパラメータではメンバーの範囲を定義し、その先頭は、現在のメンバーから指定された数だけ進んだメンバーになり、末尾は、指定した範囲の終わりになります。次のパラメータでは、範囲を指定します。

  • CURRENT MEMBERを指定すると、現在のメンバーが範囲の先頭になります。

  • offset_expr FOLLOWINGを指定すると、現在のメンバーからoffset_exprだけ進んだメンバーが範囲の先頭になります。

  • offset_expr FOLLOWINGを指定すると、現在のメンバーからoffset_expr分だけ進んだメンバーが範囲の末尾になります。

  • UNBOUNDED FOLLOWINGを指定すると、そのレベルの最後のメンバーが範囲の末尾になります。

hierarchy_ref

分析ビューの階層への参照。hier_aliasパラメータでは、分析ビューの定義に階層の別名を指定します。特殊文字のエスケープまたはケースの保持、あるいはその両方を行うには、二重引用符を使用します。

オプションのattr_dim_aliasパラメータでは、分析ビューの定義に属性ディメンションの別名を指定します。指定された階層の別名が分析ビューの別の階層の別名と競合する場合、または分析ビューの定義で属性ディメンションが複数回使用されている場合は、attr_dim_aliasパラメータを使用して、あいまいさを解決できます。attr_dim_aliasパラメータは、名前の競合が存在しない場合も使用できます。

rank_expression

階層のランク計算では、指定されたメジャー値の順序に基づいて、指定された階層の関連メンバーがランク付けされ、その結果内で現在のメンバーのランクが戻されます。

階層のランク計算では、指定された階層内の一連の関連メンバーが検索され、指定されたメジャー値の順序に基づいてすべての関連メンバーがランク付けされ、その結果内で現在のメンバーのランクが戻されます。関連メンバーは、現在のメンバーと同じレベルのメンバーのセットです。オプションで階層関係によってセットを制限できますが、セットには必ず現在のメンバーが含まれます。メジャー値の順序付けはrank_clausecalc_meas_order_by_clauseによって決定されます。

rank_function_name

各階層ランク付けファンクションにより、calc_meas_order_by_clauseに基づき、1から始まる順序番号が各関連メンバーに割り当てられます。同じメジャー値の処理方法はファクションによって異なります。

各種ファンクションとそれぞれの相違点は次のとおりです。

  • RANKは、同じメジャー値に同じランクを割り当てます。一連の結合された値の後のランクは、結合された値と結合された順序値を加算した数値です。そのため、順序付けは連続した番号にならないことがあります。

  • DENSE_RANKは、同じメジャー値に同じ最小ランクを割り当てます。一連の結合された値の後のランクは、必ず結合された値に1を加算した数値になります。そのため、順序付けは必ず連続した番号になります。

  • AVERAGE_RANK,では、同じ値には同じ平均ランクが割り当てられます。平均ランク値の後の次の値は、同じ値に1を加算して、その合計を2で除算し、平均ランク値を加算した数値です。たとえば、4、5、10、5、7という5つの一連の値の場合、AVERAGE_RANKは1、1.5、1.5、3、4を戻します。2、12、10、12、17、12という一連の値の場合は、戻されるランクは1、2、3、3、3、5です。

  • ROW_NUMBERは、階層メンバー間で連続した一意の値を割り当てます。calc_meas_order_by_clauseの結果が等しい値になる場合、その結果は非決定的になります。

rank_clause

rank_clauseでは、現在のメンバーに関連する階層メンバーの範囲を特定します。範囲は、現在のメンバーと同じレベルにあるメンバーのサブセットです。サブセットはWITHIN句から決定されます。

WITHIN句の有効な値は次のとおりです。

  • WITHIN LEVELは、関連メンバーが現在のレベルのすべてのメンバーであることを指定します。これは、WITHINキーワードが指定されない場合のデフォルトのサブセットです。

  • WITHIN PARENTは、すべての関連メンバーが現在のメンバーと親を共有することを指定します。

  • WITHIN ANCESTOR AT LEVELは、関連メンバーが、指定されたレベルで祖先(または自体)を現在のメンバーと共有する現在のレベルのすべてのメンバーであることを指定します。

share_of_expression

share_of_expression式では、現在のコンテキストの式の値と、関連するコンテキストの式の値の比率を計算します。この式は、現在のコンテキストおよび関連するコンテキストで評価されるcalc_meas_expressionです。share_clauseの指定により、使用する関連するコンテキストが決まります。

share_clause

share_clauseでは、指定された階層のメンバーを関連するメンバーに設定することによって、外部コンテキストを変更します。

share句のパラメータは次のとおりです。

  • HIERARCHY hierarchy_refでは、share_of_expression計算の外部コンテキストである階層の名前を指定します。

  • PARENTでは、関連するメンバーが現在のメンバーの親であることを指定します。

  • LEVEL level_refでは、関連するメンバーが、階層の指定されたレベルの現在のメンバーの祖先(またはメンバー自体)であることを指定します。現在のメンバーが、指定されたレベルよりも上にある場合は、share式に対してNULLが戻されます。階層に、このレベルがない場合は、エラーが発生します。

  • MEMBER member_expressionでは、関連するメンバーが、現在のコンテキストでmember_expressionを評価した後に戻されるメンバーであることを指定します。指定されたメンバーの値がNULLの場合、share式に対してNULLが戻されます。

member_expression

member_expressionは、指定された階層のメンバーと評価されます。階層は、常に、外部式(構文によって適用)から決定できます。member_expressionは、次のいずれかになります。

  • level_member_literalは、階層メンバーと評価される式です。

  • hier_navigation_exprは、階層のあるメンバーを別のメンバーに関連付ける式です。

  • CURRENT MEMBERでは、外部コンテキストで決定された階層のメンバーを指定します。

  • NULLは、存在しないメンバーを指定する方法です。

  • ALLでは、すべての階層の最上位の単一メンバーを指定します。

level_member_literal

level_member_literalは、階層の単一メンバーに変換する式です。この式には、レベルの名前および1つ以上のメンバー・キーが含まれます。メンバー・キーは位置または名前で識別できます。コンテキストの階層に、指定されたレベルがない場合は、エラーが発生します。

pos_member_keys

member_key_expr式は、メンバーのキー値に解決されます。位置で指定する場合、キーのすべてのコンポーネントは、ALL_HIER_LEVEL_ID_ATTRSディクショナリ・ビュー内の順序で指定する必要があります。指定されたレベルが子レベルによって決定されない階層では、そのようなすべての子レベルのすべてのメンバー・キー値を、現在のレベルのメンバー・キーより前に指定する必要があります。重複するキー・コンポーネントは、初めて出現したときにのみ指定されます。

主キーは、level_member_literalpos_member_keys句で指定された場合に使用されます。代替キーを参照するには、named_member_keys句を使用します。

named_member_keys

member_key_expr式は、メンバーのキー値に解決されます。attr_nameパラメータは、属性名の識別子です。すべての属性名が、指定されたレベルのキーまたは代替キーを構成していない場合は、エラーが発生します。

名前で指定する場合、キーのすべてのコンポーネントを指定し、すべてで属性の名前 = 値書式を任意の順序で使用する必要があります。指定されたレベルが子レベルによって決定されない階層では、そのようなすべての子レベルのすべてのメンバー・キー値を指定し、指定された書式も使用する必要があります。重複するキー・コンポーネントは、1回のみ指定されます。

hier_navigation_expression

hier_navigation_expression式は、指定されたメンバーから階層の別のメンバーにナビゲートします。

hier_ancestor_expression

指定されたメンバーから、指定されたレベルまたは深さの祖先メンバー(またはメンバー自体)にナビゲートします。深さは、数値に変換する必要がある式として指定されます。メンバーが、指定されたメンバーより上のレベルまたは深さの場合、またはメンバーがNULLの場合、式の値に対してNULLが戻されます。コンテキストの階層に、指定されたレベルがない場合は、エラーが発生します。

hier_parent_expression

指定されたメンバーから親メンバーにナビゲートします。

hier_lead_lag_expression

コンテキスト階層内で、一定のメンバーの数だけ前後に移動して、指定されたメンバーから関連するメンバーにナビゲートします。HIER_LEADキーワードを指定すると、後続のメンバーが戻されます。HIER_LAGキーワードを指定すると、先行するメンバーが戻されます。

hier_lead_lag_clause

指定されたメンバーからoffset_exprの数だけ前後にあるメンバーを対象にナビゲートします。レベル内のメンバーの順序は、属性ディメンションの定義で指定されます。

hier_lead_lag_clauseのオプションのパラメータは次のとおりです。

  • WITHIN LEVELでは、現在のメンバーと深さが同じメンバー内で、offset_exprメンバー分だけ前後に移動して、関連するメンバーが検索されます。レベル内のメンバーの順序は、属性ディメンションの定義によって決まります。WITHINキーワードとACROSSキーワードのどちらも使用されていない場合は、WITHIN LEVEL操作がデフォルトとなります。

  • WITHIN PARENTでは、現在のメンバーと深さが同じメンバー内で、offset_exprメンバー分だけ前後に移動して、関連するメンバーが検索されますが、現在のメンバーと親を共有するメンバーのみが考慮されます。レベル内のメンバーの順序は、属性ディメンションの定義によって決まります。

  • WITHIN ACROSS ANCESTOR AT LEVELは、指定されたレベルの現在のメンバーの祖先(またはメンバー自体)までナビゲートして関連するメンバーを検索し、その親内の各祖先メンバー(メンバー自体を含む)の位置を示します。祖先メンバーが見つかると、祖先メンバーと深さが同じメンバー内で、offset_exprメンバー分前後にナビゲーションが移動します。

    関連する祖先が見つかった後、ナビゲーションはそのメンバーから階層を逆方向に移動し、上に向かって記録された(逆順)親内の位置を照合します。親内での位置は、POSITION FROM BEGINNINGPOSITION FROM ENDのいずれが指定されているかに従い、最初の子または最後の子からオフセットされます。デフォルトは、POSITION FROM BEGINNINGです。レベル内のメンバーの順序は、属性ディメンションの定義によって決まります。

qdr_expression

qdr_expressionは、新しいコンテキストで指定されたcalc_meas_expressionを評価し、階層メンバーを新しい値に設定する修飾データ参照です。

qualifier

修飾子は、指定された階層のメンバーを、member_expressionの評価の結果のメンバーに設定して、外部コンテキストを変更します。member_expressionNULLの場合、qdr_expressionの選択の結果はNULLです。

av_hier_expression

av_hier_expressionでは、関連メンバーの属性値を特定するために階層ナビゲーションを実行します。av_hier_expressionは最上位の式にすることができますが、hier_navigation_expressionmember_expression引数としてのみ使用できます。

たとえば次の問合せでは、HIER_MEMBER__NAMEav_hier_expressionHIER_PARENThier_navigation_expressionです。

HIER_MEMBER_NAME(HIER_PARENT(CURRENT MEMBER) WITHIN HIERARCHY product_hier))

hier_function_name

hier_function_name値は次のとおりです。

  • HIER_CAPTIONは、階層内の関連メンバーのキャプションを戻します。

  • HIER_DEPTHは、階層内の関連メンバーとすべてのメンバーの間にある祖先の数から1を引いた数を戻します。すべてのメンバーの深さは、0です。

  • HIER_DESCRIPTIONは、階層内の関連メンバーの説明を戻します。

  • HIER_LEVELは、階層で関連メンバーが属するレベルの名前を文字列値として戻します。

  • HIER_MEMBER_NAMEは、階層内の関連メンバーのメンバー名を戻します。

  • HIER_MEMBER_UNIQUE_NAMEは、階層内の関連メンバーの一意のメンバー名を戻します。

分析ビュー式の例

このトピックには、分析ビューのMEASURES句、およびSELECT文のADD MEASURES句で定義された計算済メジャーを示す例が記載されています。

次の例があります。

その他の例は、SQL LiveのWebサイト(https://livesql.oracle.com/apex/livesql/file/index.html)にある分析ビューのチュートリアルを参照してください。

LAG式の例

これらの計算済メジャーは、LAG操作とは異なります。

-- These calculated measures are from the measures_clause of the
-- sales_av analytic view.
MEASURES
 (sales FACT sales,                      -- A base measure
  units FACT units,                      -- A base measure
  sales_prior_period AS                  -- Calculated measures
    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1)),
  sales_year_ago AS
    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL year)),
  chg_sales_year_ago AS
    (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL year)),
  pct_chg_sales_year_ago AS
    (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL year)),
  sales_qtr_ago AS
    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL quarter)),
  chg_sales_qtr_ago AS
    (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL quarter)),
  pct_chg_sales_qtr_ago AS
    (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1
     ACROSS ANCESTOR AT LEVEL quarter))
 )

ウィンドウ式の例

この計算済メジャーは、ウィンドウ操作を使用します。

MEASURES
 (sales FACT sales,
  units FACT units,
  sales_qtd AS
    (SUM(sales) OVER (HIERARCHY time_hier
     BETWEEN UNBOUNDED PRECEDING AND CURRENT MEMBER
     WITHIN ANCESTOR AT LEVEL QUARTER)),
  sales_ytd AS
    (SUM(sales) OVER (HIERARCHY time_hier
     BETWEEN UNBOUNDED PRECEDING AND CURRENT MEMBER
     WITHIN ANCESTOR AT LEVEL YEAR))      
 )

SHARE OF式の例

これらの計算済メジャーは、SHARE OF式を使用します。

MEASURES
 (sales FACT sales,
  units FACT units,
 sales_shr_parent_prod AS
   (SHARE_OF(sales HIERARCHY product_hier PARENT)),
 sales_shr_parent_geog AS
   (SHARE_OF(sales HIERARCHY geography_hier PARENT)),
 sales_shr_region AS
   (SHARE_OF(sales HIERARCHY geography_hier LEVEL REGION)) 
 )

QDR式の例

これらの計算済メジャーは、QUALIFYキーワードを使用して、修飾データ参照式を指定します。

MEASURES
 (sales FACT sales,
  units FACT units,
  sales_2011 AS
    (QUALIFY (sales, time_hier = year['11'])),
  sales_pct_chg_2011 AS
    ((sales - (QUALIFY (sales, time_hier = year['11']))) /
    (QUALIFY (sales, time_hier = year['11'])))
 )

RANKファンクションを使用して追加されたメジャーの例

この例では、units_geog_rank_levelメジャーにRANKファンクションを使用して、レベル内の地理階層メンバーを単位に基づいてランク付けします。

SELECT geography_hier.member_name AS "Region", 
       units AS "Units", 
       units_geog_rank_level AS "Rank"
  FROM ANALYTIC VIEW (
    USING sales_av HIERARCHIES (geography_hier)
    ADD MEASURES (
      units_geog_rank_level AS (
        RANK() OVER (
          HIERARCHY geography_hier
          ORDER BY units desc nulls last
          WITHIN LEVEL))
    )
  )
  WHERE geography_hier.level_name IN ('REGION')
  ORDER BY units_geog_rank_level;

問合せの結果は次のとおりです。

Regions            Units  Rank
-------------  ---------  ----
Asia            56017849     1
South America   23904155     2
North America   20523698     3
Africa          12608308     4
Europe           8666520     5
Oceania           427664     6