プライマリ・コンテンツに移動
Oracle® Big Data Discovery Cloud Service EQLリファレンス

E65371-04
目次へ
目次
索引へ移動
索引

前
次
機械翻訳について

MEMBERS拡張

MEMBERSは、GROUP BYの拡張機能で、セットのメンバーごとにグループ化できます。

MEMBERSでは、複数割当属性でグループ化できます。 複数割当属性でグループ化する場合は、すべての行が(属性の割当がない行も含めて)保持されることに注意してください。

MEMBERS構文

MEMBERSは、次の構文を使用してGROUP BY句に記述されます:
GROUP BY MEMBERS(<set>) AS <alias> [,MEMBERS(<set2>) AS <alias2>]*
説明:
  • setは、任意のセット・データ型(mdex:string-setまたはmdex:long-setなど)で、属性参照である必要があります。 たとえば、setは、特定のコレクションからの複数割当て文字列属性にすることができます。

    LETを使用しない場合、MEMBERSはソース文またはコレクションからの属性のみを参照できます(つまり、ローカルに定義することはできません)。 LETを使用する場合、MEMBERSは、SELECT句ではなくLET句で定義されている属性を参照できますが、同じ文で定義されている属性を参照できます。

  • 「別名」は、NCName準拠の別名であることが必要です。 文の結果では、別名はセットの要素と同じデータ型を持ちます。

構文が表示されるように、EQLでは複数のセットのメンバーによるグループ化が同時にサポートされています。 そのためには、GROUP のリストに複数のMEMBERS句を含めます。

MEMBERSフォームは、次のような表面構文を使用してグループ化設定で使用できます:
GROUP BY ROLLUP(a, b, MEMBERS(c) AS cValue, d)

なお、集合のメンバーでグループ化することは任意の文で使用でき、コレクションでの値のみでは使用できません(EQLのすべての値が文の境界を超えて保持されるため)。

MEMBERSデータ型のエラー・メッセージ

単一割当て属性をMEMBERSの引数として使用しようとすると、次の例のようなエラー・メッセージが返されます:
Argument to MEMBERS has type mdex:double; only set types are permitted.

このエラーの例では、マルチ割当てのdouble属性(mdex:double-set)のかわりに、MEMBERSは単一割当てのdouble属性(mdex:double)とともに使用されていました。

MEMBERSの例

小さなデータ・セットが25レコードで、各レコードの本文複数割当属性が0、1または2つの割当を持つ場合を考えます。 WineIDは単一割当属性で、Wineコレクションのキーです。 次の問合せの例が作成されます:
RETURN Results AS
SELECT
  SET(WineID) AS IDs
FROM WineState
GROUP BY MEMBERS(Body) AS bodyType
この文の結果は次のようになります:
IDs                                          bodyType
-------------------------------------------------------
| { 14, 15 }                                | Supple  |
| { 22, 25 }                                | Firm    |
| { 19 }                                    | Fresh   |
| { 11, 19, 22, 23, 24, 25, 4, 6, 8 }       | Robust  |
| { 10, 11, 12, 13, 16, 18, 3, 4, 5, 7, 9 } | Tannins |
| { 10, 12, 13, 16, 18, 3, 5, 7, 9 }        | Silky   |
| { 1, 17, 2, 20, 21 }                      |         |
-------------------------------------------------------

結果では、複数のレコードが複数のバケットに関与しますが、これは本文の割当てが2つあるためです。 結果の最後の5つのレコードには本文属性の割当てはありませんが、グループ化中に廃棄されることはなく、bodyTypeがNULLであることがリストされます。 (WineIDを使用すると、idセット内の値を参照して、どの入力行がどの出力行に影響したかを正確に決定できます。 たとえば、レコード4はRobustとTanninsの両方を占めており、レコード14はSuppleにのみ寄与し、レコード16はTanninsおよびSilkyに役立ちます。)

この2番目の例では、複数のセットのメンバーによる同時グループ化の方法を示します。 本文およびスコアの複数割当属性は、WineTypeの単一割当属性と同様に、問合せで使用されます:
RETURN Results AS
SELECT
  SET(WineID) as IDs
FROM WineState
WHERE WineType = 'White'
GROUP BY MEMBERS(Body) AS bodyType, MEMBERS(Score) AS scoreValue
この問合せの結果は次のようになります:
IDs      bodyType  scoreValue
------------------------
| { 25 } | Firm   | 82 |
| { 25 } | Firm   | 84 |
| { 19 } | Fresh  | 88 |
| { 25 } | Robust | 82 |
| { 25 } | Robust | 84 |
| { 19 } | Robust | 88 |
| { 20 } |        | 71 |
| { 20 } |        | 75 |
| { 21 } |        | 87 |
| { 21 } |        | 89 |
------------------------

WineID=25のレコードは、 { Firm, Robust }と { 82, 84 }のクロス積に対応する4つのバケットに寄与します。 レコード20と21にはスコア属性の割当てがありますが、ボディ属性の割当てはなく、bodyTypeがNULLでscoreValueが値を持つリストされています。

GROUPING SETSとのMEMBERS相互作用に関する注意

セット・メンバーによるグループ化がGROUPING SETS (CUBEおよびROLLUPを含む)と対話し、最初に予期しないと思われる結果を生成することに注意してください。

たとえば、まず、ROLLUP拡張機能のみでグループ化する問合せを作成します:
RETURN Results AS
SELECT
  SUM(Price) AS totalPrice
FROM WineState
GROUP BY ROLLUP(WineType)
データ・セットの結果は次のとおりです:
WineType          totalPrice
----------------------------
| Blanc de Noirs  |  16.99 |
| Brut            |  46.98 |
| Zinfandel       |        |
| Merlot          |  25.99 |
| Bordeaux        |  21.99 |
| Chardonnay      |  52.90 |
| White           |  97.97 |
| Pinot Noir      |  14.99 |
| Red             | 142.34 |
|                 | 420.15 |
----------------------------

WineTypeごとに1行、下部に1つのサマリー行が表示されます。これには、すべてのWineType値のレコードが含まれています。 SUMは連想であるため、totalPriceサマリー行は他のすべての行に対するtotalPriceの値の合計と等しくなり、420.15の結果はその予想値を満たします。 (白の勝者の合計は97.97.であることに注意してください)

次に類似した問合せを行いますが、MEMBERSおよびROLLUPでは、白のワインのみを選択してグループ化します:
RETURN Results AS
SELECT
  SUM(Price) AS totalPrice
FROM WineState
WHERE WineType = 'White'
GROUP BY ROLLUP(WineType, MEMBERS(Body) AS bodyType)
この2番目の問合せの結果は次のとおりです:
WineType bodyType totalPrice
--------------------------
| White | Firm   | 43.99 |
| White | Fresh  | 20.99 |
| White | Robust | 64.98 |
| White |        | 32.99 |
| White |        | 97.97 |
|       |        | 97.97 |
--------------------------

結果には、サマリー行と個々の行の間の対応が期待したとおりでないことが示されます。 たとえば、白サマリー行(WineTypeは白、bodyTypeがnullである行)のtotalPriceは、その上の(白、会社)、(白、Fresh)および(白、Robust)行の合計価格の合計になります。

ただし、最初の4行に合計価格を追加すると、97.97.の予想値ではなく162.95を取得します。 この不一致は、セットのメンバーでグループ化すると、行が複数のバケットに寄与する可能性があるためです。 特に、レコード19には2つの本文割当て(FreshとRobust)があるため、(White, Fresh)行と(White, Robust)行の両方に影響し、その価格はダブル・カウントされます。

EQLでは、白サマリー行が効果的に計算されますが、WineType (単一割当て属性)でグループ化することで、各入力行は1回のみカウントされます。