日本語PDF

25 属性ディメンションおよび階層オブジェクト

属性ディメンションはデータ・ソースを参照し、属性およびレベルを指定します。階層はレベルを階層的に編成します。

属性ディメンションおよび階層については、次のトピックで説明しています。

25.1 属性ディメンションおよび階層について

属性ディメンションは、データ・ソース、属性およびレベルを指定します。階層はレベルを階層的に編成します。

属性ディメンションは、使用するデータ・ソースを指定し、そのソースの列を属性として指定します。一部またはすべての属性のレベルを指定し、レベル間の属性の関係を決定します。

階層では、属性ディメンションのレベル間の階層リレーションシップを定義します。属性ディメンションおよび階層は、分析ビュー・オブジェクトのディメンション・メンバーを提供します。

ディメンションおよび階層に関連するメタデータの多くは、属性ディメンションで定義されます。階層は、使用する属性ディメンションのすべてのメタデータを継承します。これにより、属性およびレベルのメタデータが多くの階層で再使用され、一貫性が促進され、階層の定義を単純化できます。

属性ディメンションについて

属性ディメンションには次の特性があります。

  • データ・ソース(通常はスター・スキーマまたはスノーフレーク・スキーマのディメンション表ですが、非正規化表、ビュー、外部表またはリモート表である場合があります。ディメンション表の各列は階層に設定できます)

  • ディメンション・タイプ(STANDARDまたはTIME)

  • 属性(データ・ソースの列)

  • レベル(同じレベルの集計にあるすべての値のグループを表します)

  • 階層属性(階層によって使用され、レベル間の階層関係を示す)

  • 1つのメンバーのみを持つ暗黙的なALLレベル(属性ディメンションを使用する階層の最も高いレベルです)

  • 任意の数の階層が使用できます

属性ディメンションには次のオプションの特性もあります。

  • メタデータまたはメタデータとデータをアプリケーション・コンテナと共有するように指定できます

  • レベル・メンバーの順序を指定できます

  • 属性ディメンション自体、属性、一部の階層属性、レベルおよびALLメンバーの分類を指定できます。アプリケーションが問合せに使用したり、問合せ結果を表示するために使用したりできるメタデータが分類によって提供されます

含まれているレベルによって判別される属性は、階層の列になる属性を指定するため、その階層を参照する分析ビューの属性となります。

属性ディメンションおよびレベル・タイプについて

属性ディメンションは、STANDARDタイプまたはTIMEタイプにすることができます。機能的には、STANDARDタイプおよびTIMEタイプの属性ディメンションは同じです。ただし、TIMEタイプの属性ディメンションの各レベルでは、レベル・タイプを指定する必要があります(レベル・メンバーの値はそのタイプである必要はありません)。たとえば、TIMEタイプの属性ディメンションでは、レベル・タイプQUARTERSのSEASONという名前のレベルを作成できますが、値は季節の名前になります。レベル・タイプは任意に選択した用途に使用できます。

STANDARDタイプの属性ディメンションのレベルは、STANDARDタイプです。STANDARDタイプの属性ディメンションのレベルには、レベル・タイプを指定する必要はありません。

TIMEタイプの属性ディメンションのレベルは、次のレベル・タイプのいずれかである必要があります。

  • YEARS

  • HALF_YEARS

  • QUARTERS

  • MONTHS

  • WEEKS

  • DAYS

  • HOURS

  • MINUTES

  • SECONDS

階層について

階層の特性は次のとおりです。

  • 属性ディメンション

  • 属性ディメンションのレベルの階層順序

  • レベルの各属性(判別された属性を含む)の列

  • 階層属性の列

  • 階層の各レベルの各メンバーの行、および単一の最上位の集計値を表す暗黙的なALLレベルの行

  • 属性ディメンションから継承したメタデータ

  • SQLのSELECT文のFROM句に使用できます

階層には次のオプションの特性もあります。

  • メタデータまたはメタデータとデータをアプリケーション・コンテナと共有するように指定できます

  • 階層自体および階層属性の分類を指定できます

例25-1 単純な属性ディメンション

属性ディメンションは、キー属性のみを定義したレベルと属性のリストのような単純なものにすることができます。この例は、TIME_DIM表のYEAR_ID、QUARTER_IDおよびMONTH_ID列のみを属性として指定した属性ディメンションを作成しています。

CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim       -- References the TIME_DIM table
ATTRIBUTES           -- A list of table columns to be used as attributes
 (year_id,
  quarter_id,
  month_id)
LEVEL MONTH          -- A level
  LEVEL TYPE MONTHS  -- The level type
  KEY month_id       -- Attribute with unique values
LEVEL QUARTER
  LEVEL TYPE QUARTERS
  KEY quarter_id
LEVEL YEAR
  LEVEL TYPE YEARS
  KEY year_id;

TIME_DIM表の詳細は、例のデータとスクリプトについてを参照してください。

TIME_DIM表の各_ID列は、属性リストに含まれています。デフォルトでは、属性の名前はディメンション表の列の名前です。属性に異なる名前を指定するには、定義でAS alias句を使用します。

レベルはKEYプロパティ(レベルで唯一の必須のプロパティです)を使用して各属性に作成されます。

例25-2 単純な階層

CREATE OR REPLACE HIERARCHY time_hier  -- Hierarchy name
USING time_attr_dim      -- Refers to the TIME_ATTR_DIM attribute dimension
 (month CHILD OF         -- Levels in the attribute dimension
  quarter CHILD OF
  year);

階層には、属性ディメンションの各属性および階層属性の列があります。

SELECT column_name from ALL_HIER_COLUMNS WHERE HIER_NAME = 'TIME_HIER';
time_hier_columns.pngの説明が続きます
図time_hier_columns.pngの説明

次の文は、TIME_ATTR_DIMが例25-1で定義された属性ディメンションである場合に、TIME_HIERから属性列および一部の階層列を選択しています。

SELECT year_id, quarter_id, month_id,
       member_name, member_unique_name
       member_caption, member_description
  FROM time_hier
  ORDER BY hier_order;

問合せ結果の一部を示します。

time_hier_col_subset.pngの説明が続きます
図time_hier_col_subset.pngの説明

25.2 属性および階層属性

通常、属性ディメンションの属性はソース表またはビューの列を参照しています。階層属性は、階層のメンバーに関する情報を提供します。

属性ディメンションで、属性は参照するソース表またはビューの列を指定します。属性のデフォルト名は表の列名です。属性に異なる名前を指定するには、SQLのSELECT句の別名に似た構文を使用します。レベルは属性を使用して定義し、属性間の関係はレベルを使用して定義します。属性は、階層に含まれるレベル、およびレベルに定義されている属性の関係に応じて、階層の列として表示されます。

階層属性は次のとおりです。

  • DEPTHは階層メンバーのレベルの深さです。ALLレベルは深さ0 (ゼロ)です

  • HIER_ORDERは階層内のメンバーの順序です

  • IS_LEAFは、メンバーが階層の最も低い(リーフ)レベルにあるかどうかを示すブール値です

  • LEVEL_NAMEは、属性ディメンションの定義内のレベルの名前です

  • MEMBER_NAMEは、属性ディメンションの定義内のメンバーの名前です

  • 属性ディメンションまたは階層の定義に値を指定していない場合、MEMBER_CAPTIONNULLです

  • 属性ディメンションまたは階層の定義に値を指定していない場合、MEMBER_DESCRIPTIONNULLです

  • MEMBER_UNIQUE_NAMEは、階層内で一意であることが保証されている名前であり、レベル名、祖先およびキー属性値を連結したものです

  • PARENT_LEVEL_NAMEは、現在のメンバーの親のレベルの名前です

  • PARENT_UNIQUE_NAMEは、現在のメンバーの親のMEMBER_UNIQUE_NAMEです

階層属性値は、レベルおよび系統で構成されます。系統にはメンバーのキー値が含まれています。系統の各コンポーネントは角括弧で囲み、コンポーネントはピリオドで区切ります。コンポーネント値に右角括弧が含まれている場合は、2つの右角括弧を使用して表されます。

例25-3 階層属性への値の設定

これは、属性ディメンションおよび階層についての単純な属性ディメンションに基づいた階層に対する問合せの結果の一部です。

time_hier_col_subset.pngの説明が続きます
図time_hier_col_subset.pngの説明

この階層は機能していますが、いくつかの重要な機能が欠けています。MEMBER_NAME列は読みやすいとは言えず、MEMBER_CAPTION列およびMEMBER_DESCRIPTION列にはデータが返されていません。

time_attr_dim属性ディメンションのこの新しい定義には、TIME_DIM表の_NAME列が含まれています。レベルの定義では、階層属性MEMBER_NAMEMEMBER_CAPTIONおよびMEMBER_DESCRIPTIONの値が含まれている属性を指定しています。この定義は、レベル・メンバーの指定値を持つ属性ディメンションを使用する階層を提供します。

CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
 (year_id,
  year_name,
  quarter_id,
  quarter_name,
  month_id,
  month_name,
  month_long_name)
LEVEL MONTH
  LEVEL TYPE MONTHS
  KEY month_id
  MEMBER NAME month_name
  MEMBER CAPTION month_name
  MEMBER DESCRIPTION month_long_name
LEVEL QUARTER
  LEVEL TYPE QUARTERS
  KEY quarter_id
  MEMBER NAME quarter_name
  MEMBER CAPTION quarter_name
  MEMBER DESCRIPTION quarter_name
LEVEL YEAR
  LEVEL TYPE YEARS
  KEY year_id
  MEMBER NAME year_name
  MEMBER CAPTION year_name
  MEMBER DESCRIPTION year_name;

この文は、TIME_HIER階層から属性列およびいくつかの階層列を選択します。

SELECT year_id, quarter_id, month_id,
       member_name, member_unique_name,
       member_caption, member_description
  FROM time_hier
  ORDER BY hier_order;

問合せ結果の一部を示します。

time_hier_col_subset_hier_attrs.pngの説明が続きます
図time_hier_col_subset_hier_attrs.pngの説明

期間の順序は、時系列の計算のレポートのためにはまだ正しくありません。たとえば、1月の前に2月があります。レベルのソート順を指定する例については、レベルの順序を参照してください。

25.3 レベルの順序

属性ディメンション・レベル・メンバーの順序を指定できます。

属性ディメンションのレベル定義のORDER BY句を使用すると、レベルのメンバーの順序を指定できます。デフォルトでは、属性ディメンション・レベルの値は、MEMBER_NAME値によってアルファベット順にソートされます。メンバー名を指定しない場合、レベルはKEY属性値で順序付けされます。

ORDER BY句では、NULL値を順序の最初または最後のどちらにするかも指定します。属性がレベルによって判別されない場合は、MINまたはMAXを指定できます(デフォルトはMINです)。

例25-4 最終日の追加

この例は、最終日属性をtime_attr_dim属性ディメンションの定義に追加しています。

CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
 (year_id,
  year_name,
  year_end_date,
  quarter_id,
  quarter_name,
  quarter_end_date,
  month_id,
  month_name,
  month_long_name,
  month_end_date)
LEVEL MONTH
  KEY month_id
  MEMBER NAME month_name
  MEMBER CAPTION month_name
  MEMBER DESCRIPTION month_long_name
  ORDER BY month_end_date
LEVEL QUARTER
  KEY quarter_id
  MEMBER NAME quarter_name
  MEMBER CAPTION quarter_name
  MEMBER DESCRIPTION quarter_name
  ORDER BY quarter_end_date
LEVEL YEAR
  KEY year_id
  MEMBER NAME year_name
  MEMBER CAPTION year_name
  MEMBER DESCRIPTION year_name
  ORDER BY year_end_date;

これはtime_hier階層の定義です。

CREATE OR REPLACE HIERARCHY time_hier
USING time_attr_dim
 (month CHILD OF
  quarter CHILD OF
  year);

この問合せには階層の順序属性が含まれています。

SELECT year_id,
  quarter_id,
  month_id,
  member_name,
  hier_order
FROM time_hier
ORDER BY hier_order;

問合せ結果の一部を示します。

time_hier_col_subset_orderby.pngの説明が続きます
図time_hier_col_subset_orderby.pngの説明

レベルのメンバーが最終日でソートされるようになりました。

25.4 レベル・キー

レベルのキー属性は、レベル・メンバーのデータ・ソースを指定します。

属性ディメンション・レベルは、レベルのメンバーを指定するキー属性およびオプションの代替キー属性を指定します。

レベルには、単一の属性、または複合キーの場合は複数の属性によって定義されるキーがある必要があります。キーの各個別値によって、そのレベルの属性ディメンション・メンバーが定義されます。

レベルは、1つ以上の代替キーを持つこともできます。代替キーはレベル・キーと1対1の関係である必要があります。代替キーとして指定する属性は、レベルの各メンバーのキー属性に対して一意の値である必要があります。

例25-5 PRODUCT_ATTR_DIM属性ディメンションの作成

この例は、product_attr_dim属性ディメンションを作成しています。LEVEL句には、キーと代替キーが指定されています。

CREATE OR REPLACE ATTRIBUTE DIMENSION product_attr_dim
USING product_dim 
ATTRIBUTES
 (department_id,
  department_name,
  category_id,
  category_name)
LEVEL DEPARTMENT
  KEY department_id
  ALTERNATE KEY department_name
  MEMBER NAME department_name
  MEMBER CAPTION department_name
  ORDER BY department_name
LEVEL CATEGORY
  KEY category_id
  ALTERNATE KEY category_name
  MEMBER NAME category_name
  MEMBER CAPTION category_name
  ORDER BY category_name
  DETERMINES(department_id)
ALL MEMBER NAME 'ALL PRODUCTS';

25.5 属性の関係の決定

レベルの属性によって他の属性の値が判別されるように指定できます。

属性ディメンション定義のDETERMINES句を使用すると、レベルのキー属性と他の属性の関係を指定できます。ある属性の各値に対する別の属性の値が1つのみである場合は、ある属性の値によって別の属性の値が決まります。たとえば、MONTH_IDの各値に対しては1つのQUARTER_ID値のみがあり、MONTH_IDによってQUARTER_IDが決まります。

レベルによって判別される属性は、その属性ディメンションを使用する階層に含められます。DETERMINES句に指定する属性は、別々のレベル・メンバーで値が同じであってもかまいません。レベルによってキーおよび代替キーの属性が暗黙的に決定されますが、DETERMINES句の属性と異なり、それらの属性は一意の値である必要があります。

DETERMINES句によって指定される関係では、次のことを行うことができます。

  • 階層によって返される行数の変更

  • 特定の属性によって特定の行のデータが返されるかどうかの制御

  • 分析ビューの問合せ時に生成されるSQLの単純化

判別される属性を指定すると、階層または分析ビューがメンバーの一意の値を判別するために役立ちます。属性がレベルによって判別される場合は、判別される属性と階層メンバーの関係を識別する属性値を問合せに明示的に指定する必要がありません。たとえば、QUALIFYの計算では一意に識別された階層メンバーが必要となります。DETERMINES句で属性を省略した場合は、QUALIFYの計算を使用する分析ビューのメジャーで、一意のメンバーを識別するためにそれらの属性を明示的に指定する必要があります。

判別される属性とキーおよび代替キーの属性の関係は、属性ディメンションまたは属性ディメンションを使用する階層で検証または施行されません。関係を検証するには、ソース表またはビューのデータを検査するPL/SQLプロシージャDBMS_HIERARCHY.VALIDATE_HIERARCHYを使用します。

使用上のノート

DETERMINES句を使用する場合は、次のことを考慮してください。

  • 低いレベルのキーによって親レベルの値が決まる場合は、階層内の親レベルのKEY属性をDETERMINES句に含めます。低いレベルは、判別された祖先のレベルの属性を継承します。このため、親レベルのキー属性値を低いレベルのDETERMINES句に含めることをお薦めします。

  • MEMBER NAMEMEMBER CAPTIONMEMBER DESCRIPTIONおよびORDER BYプロパティの値は、KEY属性値によって決まることが想定されます。それらのプロパティの属性をDETERMINES句に含める必要はありません。ただし、それらの属性のデータがKEY属性の各値に対して1つの値のみを持つことを確認する必要があります。

例25-6 DETERMINES句の追加

この例は、time_attr_dimのレベルにDETERMINES句を追加しています。

CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
 (year_id,
  year_name,
  year_end_date,
  quarter_id,
  quarter_name,
  quarter_end_date,
  month_id,
  month_name,
  month_long_name,
  month_end_date)
LEVEL MONTH
  LEVEL TYPE MONTHS
  KEY month_id
  MEMBER NAME month_name
  MEMBER CAPTION month_name
  MEMBER DESCRIPTION month_long_name
  ORDER BY month_end_date
  DETERMINES (quarter_id)
LEVEL QUARTER
  LEVEL TYPE QUARTERS
  KEY quarter_id
  MEMBER NAME quarter_name
  MEMBER CAPTION quarter_name
  MEMBER DESCRIPTION quarter_name
  ORDER BY quarter_end_date
  DETERMINES (year_id)
LEVEL YEAR
  LEVEL TYPE YEARS
  KEY year_id
  MEMBER NAME year_name
  MEMBER CAPTION year_name
  MEMBER DESCRIPTION year_name
  ORDER BY year_end_date;

TIME_HIER階層からLEVEL_NAME、_IDおよびMEMBER_UNIQUE_NAME列を選択します。

SELECT level_name,
  year_id,
  quarter_id,
  month_id,
  member_unique_name
FROM time_hier
ORDER BY hier_order;

前の問合せの次の結果に示されているように、月、四半期および年の属性の間の関係が階層で認識されるようになりました。MEMBER_UNIQUE_NAME値は、レベル名およびKEY属性値のみから作成されるようになりました。例25-3に示されているような完全な系統を含める必要はなくなりました。

time_hier_col_subset_determines.pngの説明が続きます
図time_hier_col_subset_determines.pngの説明