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 におけるその他 2 つの主要な概念であるタプルとキューブを紹介します。以下のトピックについて説明します。

タプルの概要

タプルは、さまざまなディメンジョンのメンバを組み合わせたものです。 各タプルには値が 1 つあります (NULL の場合もあります)。

結果セット内の各データ・セルがタプルです。例えば、以下のクエリを考えてみます。

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

このクエリでは、9 個のタプルから成るセットが返されます。例えば、最初のタプルは (City ディメンジョンの) Cedar Falls と (Measures ディメンジョンの) %COUNT を組み合わせたものです。

タプルの作成

タプルは、以下の構文を使用して直接作成することができます。

(member_expr1, member_expr2, member_expr3, ...)

member_expr1member_expr2member_expr3 (以降同様) はメンバ式です。

MDX の他の実装では、これらのメンバ式それぞれが、別々のディメンジョンに関連付けられている必要があります。つまり、1 つのタプルに、同じディメンジョンの複数のメンバを含めることはできません。

DeepSee MDX では、1 つのタプル式に、同じディメンジョンの複数のメンバ式を含めることができます。ほとんどの場合、結果は NULL になります。これは、ほとんどの場合にレコードが 1 つのメンバにのみ属するためです。 ただし、DeepSee では、レベルはリスト値に基づくことができます。つまり、ある 1 つのレコードが複数のメンバに属することができます。例えば、タプル (allerd.soy,allerd.wheat) は、大豆と小麦の両方にアレルギーがあるすべての患者を表します。

完全修飾されたタプルと部分修飾されたタプル

タプルは、完全修飾されていても部分修飾されていてもかまいません。

  • タプル式がキューブ内の各ディメンジョンを参照する場合、そのタプルは完全修飾されています。完全修飾されたタプルは、非常に少数のレコードを参照し、細かすぎて一般的に使用することができません。

  • タプル式がキューブ内の各ディメンジョンを参照しない場合、そのタプルは部分修飾されています。部分修飾されたタプルは、特にクエリで使用されるデータをフィルタ処理するために使用する場合に非常に役立ちます。

    タプルが参照するメンバが 1 つだけの場合、タプルはそのメンバと同等になります。 例えば、以下の式はどちらも同じデータにアクセスします。

    (colord.red)
    colord.red
    

    (colord.red) は、ColorD ディメンジョンの Red メンバを使用するタプル式です。

    colord.red は、ColorD ディメンジョンの Red メンバを参照するメンバ式です。

    それぞれの式は、好きな色が赤の患者にのみアクセスします。

タプルのセット

タプルのセットを作成するには、タプル式のコンマ区切りのリストを中括弧で囲みます。

{tuple_expression1, tuple_expression2, ...}

(MDX の他の実装では、セット内のあらゆるタプルにおいて、各タプルを同じように構築する必要があります。例えば、最初のタプルがその最初のリスト項目にディメンジョン A を使用している場合、他のすべてのタプルも同様にする必要があります。DeepSee MDX には、この制約はありません。)

タプルのセットを作成するために、CROSSJOIN 関数または NONEMPTYCROSSJOIN 関数を使用する方法もあります。以下はその例です。

SELECT MEASURES.[%COUNT] ON 0, CROSSJOIN(gend.gender.MEMBERS,homed.city.members) ON 1 FROM demomdx
 
                                    %COUNT
 1 Female->Cedar Falls                   58
 2 Female->Centerville                   41
 3 Female->Cypress                       51
 4 Female->Elm Heights                   53
 5 Female->Juniper                       58
 6 Female->Magnolia                      58
 7 Female->Pine                          64
 8 Female->Redwood                       58
 9 Female->Spruce                        47
10 Male->Cedar Falls                     52
11 Male->Centerville                     58
12 Male->Cypress                         61
13 Male->Elm Heights                     65
14 Male->Juniper                         64
15 Male->Magnolia                        56
16 Male->Pine                            57
17 Male->Redwood                         53
18 Male->Spruce                          46

これらのセット式は、以下のように、セット式が許可されている場所であればどこでも使用することができます。

  • クエリの軸として

  • WITH 節の中で

  • セットを使用する MDX 関数への引数として

タプル値

あらゆるタプルには値があります (NULL の場合もあります)。

タプルの値は、以下のように決定されます。

  1. DeepSee は、タプル式に使用されているメジャー以外のすべてのメンバに対応する行を、ファクト・テーブル内で検索します。

  2. 次に、それらの行の値を以下のように検索します。

    • タプル式に特定のメジャーが含まれている場合、DeepSee はファクト・テーブルの該当する行ごとに、そのメジャーの値を検索します。

    • タプル式に特定のメジャーが含まれていない場合、DeepSee では既定のメジャー (通常、%COUNT) が使用されます。

  3. DeepSee は、そのメジャーに対して指定されている集約関数を使用して、それらの値をまとめて集約します。

例えば、以下のタプルを考えてみます。

(homed.32006,colord.red,allerd.[dairy products],MEASURES.[avg test score])

このタプルの値を決定するために、DeepSee は、郵便番号 32006 に属し、好きな色が赤で、乳製品にアレルギーがあるすべての患者を、ファクト・テーブル内で検索します。 次に、それらの患者の Test Score メジャーの値にアクセスして、それらの値の平均を求めます。

別の例として、(DeepSee MDX で許可されている) 以下のタプルを考えてみます。

(allerd.soy,allerd.wheat)

このタプルの値を決定するために、DeepSee は、大豆と小麦の両方にアレルギーがある患者をカウントします。

最後に、以下のタプルを考えてみます。

(homed.juniper,homed.centerville)

このタプルの値を決定するために、DeepSee は、出身地が Juniper かつ Centerville の患者をカウントします。各患者の出身地は 1 つであるため、このタプルの値は NULL になります。

タプル式の例

タプル式は、1 つのディメンジョンのあらゆる階層内のあらゆるレベルで、メンバを参照できます。以下の (Patients キューブからの) ディメンジョンを考えてみます。このディメンジョンには階層が 1 つあり、そこには 4 つのレベルがあります。

generated description: hierarchy example age

これらのいずれかのレベルのメンバを使用するタプルを作成することができます。 例えば、以下のタプル式のいずれかを使用できます。

(aged.[all patients])
(aged.[0 to 29])
(aged.5)

別の例として、上記の式のバリエーションを作成してみましょう。この場合、タプル式に他のディメンジョンのメンバを含めてみます。

(aged.[all patients],gend.male)
(aged.[0 to 29],diagd.asthma)
(aged.5,allerd.soy,colord.red)

タプルのセットをクエリの軸として使用する方法

タプルのセットをクエリの軸として使用できます。以下の例は、最も単純な、1 つのタプルで構成されているセットを示しています。

SELECT MEASURES.[%COUNT] ON 0, (homed.juniper,allerd.wheat,aged.[20 to 29]) ON 1 FROM demomdx

                                    %COUNT
Juniper->wheat->20 to 29                  1

以下の例は、クエリの軸として使用されている一連のタプルを示しています。

WITH SET myset AS 
'{(homed.[cedar falls],allerd.soy,colord.red),(homed.magnolia,allerd.soy,colord.green),
(homed.34577,allerd.eggs,colord.green)}' 
SELECT MEASURES.[%COUNT] ON 0, myset ON 1 FROM demomdx
 
                                    %COUNT
1 Cedar Falls->soy->Red                   *
2 Magnolia->soy->Green                    1
3 34577->eggs->Green                      *

別の例として、以下は DeepSee MDX で有効なクエリです。

WITH SET myset AS 
'{(homed.[cedar falls],allerd.soy,colord.green),(colord.red,allerd.soy,homed.pine,gend.male)}' 
SELECT MEASURES.[%COUNT] ON 0, myset ON 1 FROM demomdx
 
                                    %COUNT
1 Cedar Falls->soy->Green                 *
2 Red->soy->Pine->Male                    *

最後に、以下の例では、単一のディメンジョンを複数回参照するタプルを使用しています。

SELECT MEASURES.[%COUNT] ON 0, 
{(allerd.soy,allerd.wheat),(homed.juniper,homed.centerville)} ON 1 FROM demomdx
 
                                    %COUNT
1 soy->wheat                              4
2 Juniper->Centerville                    *

大豆と小麦の両方にアレルギーがある患者が 4 人います。

出身地が 2 つある患者はいません。

キューブの概要

キューブは、ディメンジョンごとに 1 つの (または、エッジ) を含む多次元構造です。 このキューブのセルはタプルです。MDX クエリは、キューブから特定のタプルを取得します。

少なくとも単純な事例では、このキューブを視覚化すると便利です。 DemoMDX キューブには、10 個のディメンジョン (Measures ディメンジョンなど) があります。簡略化するために、以下の図では、それらのディメンジョンのうちの 3 つ (HomeDGenD、および Measures) が示されています。実際に表示されているメジャーは 3 つだけであることに注意してください。

generated description: cube

キューブのそれぞれの軸はセグメントに分割されています。セグメントは、対応するディメンジョンの最下位レベルのメンバごとに 1 つです。 HomeD 軸の場合、これらのセグメントは City レベルのメンバです。

キューブ内の各セルは、完全修飾されたタプルです。各タプルには、図のように 1 つの値があります。

MDX クエリは、それぞれ値を持つ一連のタプルに対する要求です。以下のクエリを考えてみます。

SELECT CROSSJOIN(MEASURES.[%COUNT],gend.gender.MEMBERS) ON 0, homed.city.MEMBERS ON 1 FROM demomdx
 
                              Female                 Male
1 Cedar Falls                    569                  571
2 Centerville                    625                  560
3 Cypress                        575                  543
4 Elm Heights                    545                  560
5 Juniper                        570                  546
6 Magnolia                       566                  503
7 Pine                           562                  563
8 Redwood                        536                  540
9 Spruce                         550                  516

このクエリでは、DeepSee はキューブ内の該当するタプルを検索し、それらの値を取得します。例えば、最初のタプルは (homed.[cedar falls],gend.female,measures.[%COUNT]) です。このタプルの値は 569 です。

加算によって集約される各メジャー (Age など) は、キューブに直接含まれています。他のメジャーの場合、MDX はキューブの値を使用し、それらをメジャー定義に指定されているとおりに集約します。

例えば、Avg Age メジャーはキューブに直接含まれていませんが、Age メジャーは直接含まれています。Age メジャーに含まれているのは、タプル内に表されているすべての患者の累積年齢です。Avg Age メジャーを計算するために、MDX は Age%COUNT で除算します。以下のクエリを考えてみます。

SELECT CROSSJOIN(MEASURES.[avg age],gend.gender.MEMBERS) ON 0, homed.city.members ON 1 FROM demomdx
 
                              Female                 Male
1 Cedar Falls                  36.90                34.56
2 Centerville                  35.98                34.68
3 Cypress                      37.02                33.55
4 Elm Heights                  36.87                34.05
5 Juniper                      38.09                34.26
6 Magnolia                     35.64                35.03
7 Pine                         36.64                33.38
8 Redwood                      36.70                36.52
9 Spruce                       37.90                32.93

この例では、2 番目のタプルは (homed.[cedar falls],gend.male,measures.[avg age]) です。この値を取得するために、MDX は (homed.[cedar falls],gend.male,measures.[age]) の値を (homed.[cedar falls],gend.male,measures.[%COUNT]) の値で除算します。上記の結果に示されているように、19734 を 571 で除算すると 34.56 になります。

上位レベルとキューブ・ディメンジョン

ここでは、単一の階層を含むディメンジョンのみを考えてみます。

あらゆるディメンジョンにおいて、対応するキューブの軸に直接表されるのは、最下位のレベルのみです。

例えば、以下の図は、HomeD ディメンジョンのすべてのレベルを示しています。

generated description: cube w hierarchy

HomeD 軸に含まれているのは、このディメンジョンのリーフ・メンバのみ、つまり、このディメンジョンの最下位レベルのメンバのみであることに注意してください。上位レベルは、下位メンバの組み合わせで構成されます。例えば、ZIP レベルの各メンバは、City ディメンジョンの 1 つ以上のメンバで構成されています。

ここで、以下のクエリを考えてみます。

SELECT CROSSJOIN(MEASURES.[%COUNT],gend.gender.MEMBERS) ON 0, homed.zip.members ON 1 FROM demomdx
 
                              Female                 Male
1 32006                        1,120                1,062
2 32007                          536                  540
3 34577                        1,703                1,609
4 36711                          625                  560
5 38928                        1,114                1,131

このクエリでは、DeepSee はキューブの該当するタプルを検索し、それらの値を取得します。

例えば、最初のタプルは (homed.[32006],gend.female,measures.[%COUNT]) です。メンバ 32006 は、市町村 Juniper および Spruce で構成されています。つまり、タプル (homed.[32006],gend.female,measures.[%COUNT]) は、以下のタプルの組み合わせで構成されています。

  • (homed.[juniper],gend.female,measures.[%COUNT])

  • (homed.[spruce],gend.female,measures.[%COUNT])

これらのタプルの値は、それぞれ 570 と 550 です。%COUNT メジャーは加算によって集約されるため、(homed.[32006],gend.female,measures.[%COUNT]) の値は 1120 です。

キューブ・ディメンジョン内の複数の階層

1 つのディメンジョンに複数の階層が存在する場合があります。複数の階層を持つディメンジョンの場合、キューブの対応する軸には、各階層内の最下位レベルのメンバごとにセグメントが 1 つ含まれます。

以下の理論上のキューブについて考えてみます。

Members of cube 'theoretical':
-----------------------------------------
...
Dimensions
...
  Sales Date
    H1
      Sales Year
      Sales Period
      Sales Date
    H2
      Sales Quarter
...

Sales Date ディメンジョンには、2 つの階層が含まれています。 階層 H1 には、以下の 3 つのレベルがあります。

  • Sales Year レベル。例えば、このレベルのメンバの 1 つは 1990 です。

  • Sales Period レベル。例えば、このレベルのメンバの 1 つは Jan–1990 です。

  • Sales Date レベル。例えば、このレベルのメンバの 1 つは Jan 3 1990 です。

もう 1 つの階層には、レベルが 1 つだけ含まれています。

この場合、Sales Date 軸には、Sales Date のメンバごとに 1 つのセグメントと、Sales Quarter のメンバごとに 1 つのセグメントが含まれています。以下はその例です。

generated description: multiple hierarchies in cube

(スペースの都合で、このキューブの図はタプルに分割されていません。)

例えば、クエリで Sales Quarter レベルが使用されている場合、DeepSee は、その軸の適切な部分を使用して、要求されたタプルにアクセスします。

FeedbackOpens in a new tab