分析ビュー式
分析ビュー式を使用すると、分析ビューの定義内、または分析ビューから選択する問合せに計算済メジャーを作成できます。
分析ビュー式は、表や列ではなく、階層および分析ビューの要素を参照する点で他のタイプの式とは異なります。
分析ビュー式は次のいずれかです。
-
av_meas_expression
(これは分析ビューのメジャーに基づいています) -
av_hier_expression
(これは関連メンバーの属性値を戻します)
分析ビュー式は、CREATE
ANALYTIC
VIEW
文のcalc_measure_clause
、およびSELECT
文のWITH
句またはFROM
句で、calc_meas_expression
パラメータとして使用できます。
計算済メジャーを定義する場合は、次のタイプの式を使用することもできます。
-
単純
-
CASE
-
複合
-
日時
-
期間
構文
av_meas_expression::=
lead_lag_expression::=
lead_lag_function_name::=
lead_lag_clause::=
hierarchy_ref::=
av_window_expression::=
av_window_clause::=
preceding_boundary ::=
following_boundary::=
calc_meas_order_by_clause::=
share_of_expression::=
share_clause::=
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::=
qualifier::=
セマンティクス
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
BEGINNING
とPOSITION
FROM
END
のいずれが指定されているかに従い、最初の子または最後の子からオフセットされます。デフォルト値はPOSITION
FROM
BEGINNING
です。レベル内のメンバーの順序は、階層で使用する属性ディメンションの定義によって決まります。
av_window_expression
av_window_expression
は、現在のメンバーから開始して、現在のメンバーと同じ深さにある、指定された範囲内のメンバーのセットを選択します。WITHIN句を使用して階層関係を指定することによって、このメンバーの選択をさらに制限できます。その後、選択したメジャー値で集計が実行され、式に対する1つの結果が生成されます。
av_window_expression
のパラメータは次のとおりです。
-
aggregate_function
は、COLLECT
、GROUP_ID
、GROUPING
、GROUPING_ID
、SYS_XMLAGG
、XMLAGG
およびすべての複数引数ファンクションを除く、任意の既存のSQL集計ファンクションです。ユーザー定義集計ファンクションも使用できます。集計ファンクションの引数はcalc_meas_expression
式です。これらの式は、外部コンテキストを使用して評価され、指定された階層のメンバーは、関連する範囲の各メンバーに変更されます。このため、それぞれの式引数は関連するメンバーごとに1回評価されます。その後、結果が、aggregate_function
を使用して集計されます。 -
OVER
(
av_window_clause
)
は、使用する階層および考慮するウィンドウの境界を指定します。
関連項目:
av_window_clause
av_window_clause
パラメータは、現在のメンバーに関連するメンバーの範囲を選択します。この範囲は、preceding_boundary
パラメータまたはfollowing_boundary
パラメータで指定されたメンバーの間になります。範囲は、常に、現在のメンバーと同じレベルのメンバーに対して計算されます。
av_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_clause
のcalc_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_literal
がpos_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
BEGINNING
とPOSITION
FROM
END
のいずれが指定されているかに従い、最初の子または最後の子からオフセットされます。デフォルトは、POSITION
FROM
BEGINNING
です。レベル内のメンバーの順序は、属性ディメンションの定義によって決まります。
qdr_expression
qdr_expression
は、新しいコンテキストで指定されたcalc_meas_expression
を評価し、階層メンバーを新しい値に設定する修飾データ参照です。
qualifier
修飾子は、指定された階層のメンバーを、member_expression
の評価の結果のメンバーに設定して、外部コンテキストを変更します。member_expression
がNULL
の場合、qdr_expression
の選択の結果はNULL
です。
av_hier_expression
av_hier_expression
では、関連メンバーの属性値を特定するために階層ナビゲーションを実行します。av_hier_expression
は最上位の式にすることができますが、hier_navigation_expression
はmember_expression
引数としてのみ使用できます。
たとえば次の問合せでは、HIER_MEMBER__NAME
はav_hier_expression
、HIER_PARENT
はhier_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