Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

レベルを使用した作業

この章では、レベルの詳細を説明すると共に、レベルを使用した作業を行うための主要な MDX 関数の概要を示します。以下のトピックについて説明します。

レベルの概要

レベルを使用するとデータをグループ化できます。また、レベルにはメンバがあります。

メンバは、キューブからレコードのセットを選択します。City レベルの場合、メンバ Juniper では、出身地が Juniper である患者が選択されます。逆に、キューブ内の 1 つのレコードは、1 つ以上のメンバに属します。

メンバで可能な重複

レベルのメンバは、互いに重複してもかまいません。つまり、指定されたレコードが複数のメンバに属することができます。このような状況は、レベルがリストに基づく場合に発生します。例えば、Allergies というレベルがあり、そのレベルにはアレルギーごとに 1 つのメンバが含まれているとします。1 人の患者は、複数のアレルギーを持っていることがあるため、そのレベルの複数のメンバに属している可能性があります。

NULL 値および NULL メンバ

レベルには NULL メンバを設定できます。このメンバは、そのレベルで使用されるデータに対する値を持たないレコードを選択します。通常、このメンバの名前は None です。

階層

レベルは階層に属します。詳細は、このドキュメントで後述する “ディメンジョンおよび階層を使用した作業” の章を参照してください。

レベルの単一メンバへのアクセス

単一メンバを選択するには、そのメンバを直接参照します。 一般的な構文は以下のとおりです。

[dimension_name].[hierarchy_name].[level_name].[member name]

前述したように、DeepSee MDX では階層名を省略できます。同様に、レベル名も省略できます。

以下はその例です。

SELECT MEASURES.[%COUNT] ON 0, allerd.[ant bites] ON 1 FROM demomdx 

                                    %COUNT
ant bites                                47

メンバ名

メンバ名は、指定されたレベルで一意である必要はありません。つまり、キューブの構築時に、指定されたレベルでメンバ名が一意であることの確認は行われません。例えば、Doctor ディメンジョンでは、同じ名前のメンバを複数含めることができます。

メンバのキー

適切に定義されたキューブでは、各メンバには大文字と小文字が区別される一意のキーがあります。そのキーを使用してメンバを参照するには、以下の構文を使用します。

[dimension_name].[hierarchy_name].[level_name].&[member_key]

多くの場合、member_key はメンバ名と同じです。生成された NULL メンバの場合、キーは <null> になります。

DeepSee でのメンバ・キーの生成方法の詳細は、"DeepSee MDX リファレンス" の参照セクション “キー値” を参照してください。

MDX には、メンバのキー (またはその他のプロパティ) へのアクセスに使用できる関数 (PROPERTIES) が用意されています。この関数については、この章で後述します。

レベルの複数メンバへのアクセス

レベルの複数メンバにアクセスするには、いくつかの方法があります。

まず、MEMBERS 関数を使用できます。この場合、構文は以下のようになります。

[dimension_name].[hierarchy_name].[level_name].MEMBERS

例えば、以下のように表示されます。

SELECT MEASURES.[%COUNT] ON 0, allerd.allergies.MEMBERS ON 1 FROM demomdx
 
                                    %COUNT
 1 No Data Available                    390
 2 additive/coloring agen                46
 3 animal dander                         34
 4 ant bites                             47
 5 bee stings                            36
 6 dairy products                        30
 7 dust mites                            35
 8 eggs                                  32
 9 fish                                  45
10 mold                                  51
11 nil known allergies                  140
12 peanuts                               58
13 pollen                                57
14 shellfish                             54
15 soy                                   36
16 tree nuts                             45
17 wheat                                 52

また、以下のように、特定のレベルで選択する隣接メンバの範囲を指定することもできます。

member1:membern

例えば、以下のように表示されます。

SELECT MEASURES.[%COUNT] ON 0, {birthd.1942:birthd.1947} ON 1 FROM demomdx
 
                                    %COUNT
1 1942                                    6
2 1943                                    7
3 1944                                    6
4 1945                                   11
5 1946                                   12
6 1947                                    9

この場合、その範囲の末尾に使用するメンバのディメンジョン、階層、およびレベルの識別子を省略できます。 以下はその例です。

SELECT MEASURES.[%COUNT] ON 0, {birthd.1942:1947} ON 1 FROM demomdx

隣接しない複数のメンバを選択できます。そのためには、それらのメンバを直接参照し、以下のように中括弧で囲んだコンマ区切りのリストにそれらのメンバを配置します。

SELECT MEASURES.[%COUNT] ON 0, {allerd.eggs,allerd.soy,allerd.mold} ON 1 FROM demomdx
 
                                    %COUNT
1 eggs                                   32
2 soy                                    36
3 mold                                   51

レベル内のメンバの順序

キューブ定義内では、レベル定義によって、レベル内のメンバとそれらのメンバの既定の順序が、以下のように決定されます。

  • 日付以外のレベルの場合、キューブで異なる並べ替え順序が指定されていない限り、メンバは名前のアルファベットの昇順に並べ替えられます。

  • 日付レベルの場合、メンバは発生順に並べ替えられます。昇順か降順かは、キューブ内の定義によって決まります。

MEMBERS 関数では、メンバはレベルでの定義に従って既定の順序で返されます。以下はその例です。

SELECT gend.gender.MEMBERS ON 0,homed.city.MEMBERS ON 1 FROM demomdx
 
                              Female                 Male
1 Cedar Falls                      58                   52
2 Centerville                      41                   58
3 Cypress                          51                   61
4 Elm Heights                      53                   65
5 Juniper                          58                   64
6 Magnolia                         58                   56
7 Pine                             64                   57
8 Redwood                          58                   53
9 Spruce                           47                   46

レベルのメンバのサブセットがあり、それらのメンバが既定の順序で返されるようにする場合は、以下の例のように、HIERARCHIZE 関数を使用します。

SELECT MEASURES.[%COUNT] ON 0, HIERARCHIZE({allerd.eggs,allerd.soy,allerd.mold}) ON 1 FROM demomdx
 
                                    %COUNT
1 eggs                                   32
2 soy                                    36
3 mold                                   51

この関数の詳細は、“セットを使用した作業” の章を参照してください。

相対的な位置に基づくレベル・メンバの選択

以下の MDX 関数を使用すると、指定したメンバに基づいて、レベルの特定のメンバを選択することができます。 これらの関数はすべて、レベル内のメンバの既定の順序を使用します。 なお、これらの詳細は、キューブ定義で定義した時間ディメンジョンとデータ・ディメンジョンに応じて異なります。

  • NEXTMEMBER は、指定したレベルの次のメンバを返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, birthd.[Q1 1920].NEXTMEMBER ON 1 FROM demomdx
    
                                        %COUNT
    Q2 1920                                   *
    
    
  • PREVMEMBER は、前のメンバを返します。

  • LEAD は、レベル内で順方向にカウントして後のメンバを返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, birthd.[Q1 1920].LEAD(3) ON 1 FROM demomdx
    
                                        %COUNT
    Q4 1920                                   1
    
    
  • LAG は、レベル内で逆方向にカウントして前のメンバを返します。

時間ディメンジョンでは、これらのどの関数でもすべての親レベルが無視されます。例えば、PREVMEMBER 関数では、異なる親を持つメンバが返されることがあります。一方、データ・ディメンジョンでは、これらの関数それぞれで親レベルが考慮されます。例えば、PREVMEMBER 関数では、特定の同じ親メンバを持つ前のメンバのみが考慮されます (ここでいう時間ディメンジョンデータ・ディメンジョンは、キューブで定義されているディメンジョン・タイプのみを表しします。詳細は、"DeepSee モデルの定義" を参照してください)。これらの相違を示した例は、"DeepSee MDX リファレンス" を参照してください。

時間レベルの概要

時間レベルでは、レコードを時間でグループ化します。つまり、どのメンバも特定の日時に関連付けられたレコードで構成されています。 例えば、トランザクション日というレベルで、トランザクションをその発生日でグループ化します。時間レベルには、一般的な種類として以下の 2 つがあります。これらの相違を理解しておくことが重要です。

  • 時間軸に基づく時間レベル : この種類の時間レベルでは、時間軸を互いに隣接する時間ブロックに分割します。 このレベルのどのメンバも、単一の時間ブロックで構成されています。 より正確に表現すると、その時間ブロックに関連付けられたレコードで各メンバが構成されています。年の四半期のトランザクションというレベルでは、2011 年の第 1 四半期に属する日付に発生したすべてのトランザクションが Q1-2011 メンバにグループ化されます。

    この種類のレベルでは、ソース・データに応じて任意の数のメンバを扱うことができます。

  • 日付部分に基づく時間レベル : この種類の時間レベルでは、日付部分 の値のみが考慮され、時間軸は無視されます。どのメンバも、以下に示すように、時間軸上の異なる位置にある複数の時間ブロックで構成されています。より正確に表現すると、これらの時間ブロックに関連付けられたレコードで各メンバが構成されています。四半期のトランザクションというレベルでは、あらゆる年の第 1 四半期に属する日付に発生したすべてのトランザクションが Q1 メンバにグループ化されます。

    この種類のレベルでは、固定した数のメンバを扱います。

以下の図は、これらの種類の時間レベルを比較したものです。

generated description: time levels

これらの種類の時間レベルを同時に使用しても問題ありません。メンバをどのように組み合わせても、MDX では正しいレコード群が必ず返されます。

なお、MDX 関数の中には、時間軸に基づくレベルでは有用であっても、日付部分に基づくレベルでは役に立たないものがある点には注意が必要です。このような関数として、PREVMEMBERNEXTMEMBER などがあります。

例えば、以下のクエリを考えてみます。これは日付部分に基づくレベルを表します。Q2 で PREVMEMBER を使用すると、予想どおりにエンジンによって Q1 のデータが返されます。

SELECT [BirthQD].[Q2].PREVMEMBER ON 1 FROM patients
 
 
Q1                                      219

しかし、セットの先頭にある Q1 で PREVMEMBER を使用すると、エンジンによって何も返されません。

SELECT [BirthQD].[Q1].PREVMEMBER ON 1 FROM patients
 
 
                                          *

この結果は、正しいものです。Q1 メンバは、すべての年の第一四半期に関連するレコードを表し、それより "前" のレコードにアクセスすることには意味がありません。

これに対して、以下のクエリを考えてみます。これは時間軸に基づくレベルを表します。

SELECT [BirthD].[Q1 2011].PREVMEMBER ON 1 FROM patients
 
 
Q4 2010                                   4

この場合、メンバは時間軸の特定の部分のレコードを表し、それより前のレコードを表すことに意味があります

時間レベルで使用する専用の機能

DeepSee MDX には、時間レベルで使用する拡張機能が用意されています。このような機能として、NOW メンバ%TIMERANGE 関数などがあります。

本日を基準にしたメンバの選択 (時間レベル)

DeepSee では、日付/時間のレベルでは、NOW と呼ばれる特殊なメンバを使用できます。このメンバは、現在の日付 (実行時) を使用して、レベルの適切なメンバにアクセスします。

例えば、以下のクエリは Year ディメンジョンの現在の年にアクセスします。

SELECT birthd.year.NOW ON 1 FROM demomdx
 
2011                                      9

別の例を示します。

SELECT birthd.[quarter year].NOW ON 1 FROM demomdx

                                          
Q2 2011                                   5

また、DeepSee では、NOW からのオフセットであるメンバを示すバリエーションも使用できます。例えば、[NOW-1] では、NOW より 1 つ前に位置するメンバが検索されます。

SELECT birthd.[quarter year].[NOW-1] ON 1 FROM demomdx

                                          
Q1 2011                                   1

これらのバリエーションは、以下のようなメンバの範囲内で使用できます。

SELECT birthd.[quarter year].[now-1]:birthd.[quarter year].now ON 1 FROM demomdx

                                          
1 Q1 2011                                 1
2 Q2 2011                                 5

詳細は、"DeepSee MDX リファレンス" の “日付/時間レベルの NOW メンバ” を参照してください。

時間レベルのメンバの範囲の選択

DeepSee では、MDX に対する拡張機能が用意されており、これによって時間レベルについてメンバの範囲を定義できます。この拡張機能は %TIMERANGE 関数です。引数は 3 つあり、それらは、開始メンバ、終了メンバ、およびキーワード (既定の INCLUSIVE または EXCLUSIVE) です。範囲のどちらか片方を省略できますが、範囲の両端は省略できません。

以下の例では、範囲の両端を使用しています。

SELECT NON EMPTY DateOfSale.YearSold.MEMBERS ON 1 FROM holefoods 
WHERE %TIMERANGE(DateOfSale.YearSold.&[2009],DateOfSale.YearSold.&[2011])
 
me 
1 2009                                  179
2 2010                                  203
3 2011                                  224

次の例も範囲の片側のみ指定していますが、ここでは EXCLUSIVE キーワードを使用しています。

SELECT NON EMPTY DateOfSale.YearSold.MEMBERS ON 1 FROM holefoods 
WHERE %TIMERANGE(,DateOfSale.YearSold.&[2009],EXCLUSIVE)
 
 
1 2007                                  124
2 2008                                  156

プロパティへのアクセス

MDX では、レベルはそのレベルに固有のプロパティを持つことができます。レベルの各メンバは、プロパティに対して異なる値を持つことができます。これらのプロパティにアクセスして、クエリ結果に表示することができます。プロパティには、以下の 2 種類があります。

  • ユーザ定義のプロパティ。DeepSee では、これらはキューブ定義内で定義されます。例えば、DemoMDX キューブでは、City レベルに Population (市町村の人口) と Principal Export (市町村の主要輸出品) という 2 つのプロパティがあります。

  • 内部プロパティ。これらのプロパティには、メンバ名やメンバのキーなどの情報が含まれます。リストは、"DeepSee MDX リファレンス" の参照セクション “内部プロパティ” を参照してください。

プロパティの名前は、大文字と小文字が区別されません。

メンバのプロパティにアクセスするには、PROPERTIES 関数を使用します。以下はその例です。

SELECT homed.city.magnolia.PROPERTIES("Principal Export") ON 0 FROM demomdx
                                           
                                 bundt cake

別の例を示します。

SELECT homed.cypress.LEAD(1).PROPERTIES("name") ON 0 FROM demomdx

                                      name
                                   Magnolia

文字列式としてのプロパティ

MDX では、プロパティ値は文字列として扱われます。また、文字列リテラル ("my label" など) や連結演算子 (+) もサポートされます。そのため、以下のような式を作成できます。

"Next after Cypress: " + homed.cypress.LEAD(1).PROPERTIES("name")

また、このような式を MDX クエリで使用できます。以下はその例です。

SELECT "Next after Cypress: " + homed.cypress.LEAD(1).PROPERTIES("name") ON 0 FROM demomdx
 
                                Expression
                         Next after Cypress: Magnolia

プロパティと属性

プロパティは属性とは異なります。属性は、MDX に関する説明でよく言及されます。

MDX の実装の中には、属性を使用してキューブを定義するものがあります。属性を直接使用する MDX 関数はありません。

DeepSee では、属性は使用されません。

FeedbackOpens in a new tab