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 関数は、レベルまたはレベルのメンバを直接参照します。 ただし MDX では、レベルは階層に属し、階層はディメンジョンに属します。 階層とディメンジョンを使用することで、レベルで提供される機能を超えた機能が実現されます。

階層は、データを特に空間および時間を軸に組織化する、現実的で便利な方法です。例えば、市区町村を国でグループ化したり、国を地域でグループ化できます。このような場合、特定の国の子都市に対するクエリや、特定の国の親郵便地域に対するクエリを実行できると便利です。そこで、そのようなクエリの記述を可能にするために、DeepSee キューブではレベル間に階層を定義でき、MDX には、階層を使用した作業を可能にする関数が用意されています。

MDX では、ディメンジョンに、レコードを同様に分類する方法を指定する 1 つ以上の階層が含まれます。2 つの異なる階層間、またはある階層のレベルと別の階層のレベルとの間に、形式化されたリレーションシップはありません。 ディメンジョンの用途は、その階層やレベルの既定の動作を定義することです。

Measures ディメンジョン

メジャーはすべて、Measures と呼ばれる特殊なディメンジョンに属します。 このディメンジョンには、名前のない単一の階層が暗黙的に含まれます。この階層には、レベルは含まれません。この階層のメンバはメジャーです。

All レベル

Measures ディメンジョン以外の各ディメンジョンでは、そのレベルの全階層に表示される All レベルという特殊な任意のレベルを定義できます。このレベルを定義した場合、このレベルには、All メンバという、キューブ内のすべてのレコードに対応するメンバ 1 つが格納されます。

指定したディメンジョンの All メンバの実際の名前は、キューブの定義によって決まります。例えば、サンプルでの AgeD ディメンジョンの All メンバは、All Patients になります。

MDX シェルで cube コマンドを使用した場合、demomdx キューブ内に以下の要素が表示されます。

Elements of cube 'demomdx':
-----------------------------------------
...
Dimensions
...
 HomeD
    H1
      ZIP
      City
...

HomeD ディメンジョンには 1 つの階層 (H1) が含まれており、この階層には以下の 2 つのレベルが含まれています。

  • ZIP レベル

  • City レベル

指定された階層で、レベルはその後にリストされているレベルの親になります。例えば、ZIPCity の親という意味です。より具体的には、ZIP の各メンバは、City の 1 つ以上のメンバの親です。つまり、簡潔に言うと、1 つのレベルは別のレベルの親ですが、実際のリレーションシップは、レベル間ではなくメンバ間にあります。この簡潔表現は必ずしも正確ではありませんが、便利なので広く使用されています。

以下の図は、HomeD.H1 階層のメンバ間のリレーションシップを示しています。

generated description: hierarchy example

この階層の区別機能により、どの子要素もその親に対して一意になります。この例は、現実には郵便番号と市区町村には多対多のリレーションシップが存在するため形式的なものです。

階層のメンバへのアクセス

階層のメンバ (つまり、階層のすべてのレベルのすべてのメンバ) にアクセスするには、MEMBERS 関数を使用します。この場合、構文は以下のようになります。

[dimension_name].[hierarchy_name].MEMBERS

DeepSee MDX では、階層名を省略すると、指定されたディメンジョン内で最初に表示される階層を参照するものと見なされます。

例えば、DemoMDX キューブ内では、homed ディメンジョンに階層が 1 つだけ含まれています。以下のクエリは、その階層のメンバを示しています。

SELECT MEASURES.[%COUNT] ON 0, homed.MEMBERS ON 1 FROM demomdx
 
                                    %COUNT
 1 32006                                215
 2 Juniper                              122
 3 Spruce                                93
 4 32007                                111
 5 Redwood                              111
 6 34577                                347
 7 Cypress                              112
 8 Magnolia                             114
 9 Pine                                 121
10 36711                                 99
11 Centerville                           99
12 38928                                228
13 Cedar Falls                          110
14 Elm Heights                          118

階層に対して MEMBERS 関数を使用すると、メンバのセットが階層順で返されます。最初のメンバは All メンバです (存在する場合)。その後のメンバは、それぞれ以下のいずれかになります。

  • 前のメンバの最初の子。

  • 前のメンバの次の兄弟。

別の例として、以下のクエリはすべてのメジャーを示しています (%COUNT を除く)。

SELECT gend.gender.MEMBERS ON 0, MEASURES.MEMBERS ON 1 FROM demomdx

                              Female                 Male
1 Age                          18,413               17,491
2 Avg Age                       37.73                34.16
3 Allergy Count                   326                  332
4 Avg Allergy Count              1.08                 1.07
5 Test Score                   29,542               31,108
6 Avg Test Score                73.49                74.42

親子リレーションシップの使用法

DeepSee には、親子リレーションシップを直接使用する以下の MDX 関数が用意されています。

  • CHILDREN は、指定したメンバに子があれば返します。返される値はメンバのセットで、その順序は、レベルに指定された既定の順序に基づきます。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, homed.zip.[34577].CHILDREN ON 1 FROM demomdx
    
                                        %COUNT
    1 Cypress                               112
    2 Magnolia                              114
    3 Pine                                  121
    
    

    別の例を示します。

    SELECT MEASURES.[%COUNT] ON 0, homed.pine.CHILDREN ON 1 FROM demomdx
    
                                        %COUNT
                                      No Result
    
    
  • PARENT は、指定したメンバに親があれば返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, homed.city.[Elm Heights].PARENT ON 1 FROM demomdx
     
                                        %COUNT
    38928                                   228
    
    
  • FIRSTCHILD は、指定したメンバに子があれば最初の子を返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, homed.zip.[34577].FIRSTCHILD ON 1 FROM demomdx 
    
                                        %COUNT
    Cypress                                 112
    
    
  • LASTCHILD は、最後の子を返します (存在する場合)。

兄弟へのアクセス

DeepSee には、メンバの兄弟にアクセスする以下の MDX 関数が用意されています。

  • FIRSTSIBLING は、指定したメンバに兄弟があれば最初の兄弟を返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, birthd.[Q1 1920].FIRSTSIBLING ON 1 FROM demomdx
    
                                        %COUNT
    Q1 1920                                   *
    
    
  • LASTSIBLING は、最後の兄弟を返します (存在する場合)。

  • SIBLINGS は、指定されたメンバとその兄弟をすべて返します。以下はその例です。

    SELECT MEASURES.[%COUNT] ON 0, homed.cypress.SIBLINGS ON 1 FROM demomdx
     
                                        %COUNT
    1 Cypress                               112
    2 Magnolia                              114
    3 Pine                                  121
    
    

従兄弟へのアクセス

COUSIN 関数を使用すると、上位レベルのメンバを指定して、従兄弟にアクセスすることができます。

例えば、以下のクエリは、1990 年内の Q1 1943 の従兄弟を検索します。

SELECT MEASURES.[%COUNT] ON 0, COUSIN(birthd.[Q1 1943],birthd.1990) ON1 FROM demomdx
 
                                    %COUNT
Q1 1990                                   5

DeepSee では、相対的な位置を決定するために、キューブ定義で指定したように、レベル内のメンバの既定の順序が使用されます。

子孫メンバへのアクセス

DESCENDANTS 関数を使用して、1 つ以上下位のレベル内で、指定されたメンバの子孫を取得できます。例えば、次のクエリは [BirthD].[H1].[Period] レベル内の 1990 年のすべての子孫を取得します。

SELECT DESCENDANTS(birthd.1990,birthd.period) ON 1 FROM demomdx
 
 1 Jan-1990                               *
 2 Feb-1990                               2
 3 Mar-1990                               1
 4 Apr-1990                               1
 5 May-1990                               1
 6 Jun-1990                               *
 7 Jul-1990                               2
 8 Aug-1990                               2
 9 Sep-1990                               1
10 Oct-1990                               3
11 Nov-1990                               1
12 Dec-1990                               *

DESCENDANTS 関数では、階層のさまざまな領域内の子孫にアクセスするための多くのオプションが用意されていますが、上記の使用法が最も一般的なシナリオです。

繰り返し内での現在のメンバへのアクセス

典型的なクエリでは、メンバのセットを繰り返し処理して、それぞれを行として表示することがよくあります。また、各メンバに何か具体的なことを順番にする場合もあります。そのためには、現在のコンテキストで使用されているメンバにアクセスする CURRENTMEMBER 関数を使用します。

例えば、以下のクエリを考えてみます。

SELECT MEASURES.[%COUNT] ON 0, homed.city.MEMBERS ON 1 FROM demomdx
 
                                    %COUNT
1 Cedar Falls                           110
2 Centerville                            99
3 Cypress                               112
4 Elm Heights                           118
5 Juniper                               122
6 Magnolia                              114
7 Pine                                  121
8 Redwood                               111
9 Spruce                                 93

このクエリでは、各市町村が 1 つの行になっています。表示されているデータは、%COUNT メジャーです。代わりに、市町村の人口を表示するとします。その場合、アクセスには、PROPERTIES 関数を使用します。この関数はその行で使用されるメンバへの参照が必要です。そのためには、CURRENTMEMBER 関数を使用します。この関数は以下のように呼び出すことができます。

[dimension_name].[hierarchy_name].CURRENTMEMBER

この関数を使用すると、以下のようなクエリのバリエーションが作成できます。

SELECT homed.h1.CURRENTMEMBER.PROPERTIES("Population") ON 0, homed.city.MEMBERS ON 1 FROM demomdx
 
                                        H1
1 Cedar Falls                        90,000
2 Centerville                        49,000
3 Cypress                             3,000
4 Elm Heights                        33,194
5 Juniper                            10,333
6 Magnolia                            4,503
7 Pine                               15,060
8 Redwood                            29,192
9 Spruce                              5,900

別の例として、以下のクエリは Doctor のメンバの内部キーを示しています。

SELECT docd.h1.CURRENTMEMBER.PROPERTIES("KEY") ON 0, docd.[doctor].MEMBERS ON 1 FROM demomdx
 
                                       KEY
 1 None                              <null>
 2 Ahmed, Thelma                         34
 3 Alton, Chad                           35
 4 Black, Ashley                          4
..

FeedbackOpens in a new tab