MEMBERS
は、GROUP BY
の拡張機能で、セットのメンバーごとにグループ化できます。
MEMBERS構文
MEMBERS
は、次の構文を使用してGROUP BY
句に記述されます:
GROUP BY MEMBERS(<set>) AS <alias> [,MEMBERS(<set2>) AS <alias2>]*説明:
mdex:string-set
またはmdex:long-set
など)で、属性参照である必要があります。 たとえば、setは、特定のコレクションからの複数割当て文字列属性にすることができます。
LET
を使用しない場合、MEMBERS
はソース文またはコレクションからの属性のみを参照できます(つまり、ローカルに定義することはできません)。 LET
を使用する場合、MEMBERS
は、SELECT
句ではなくLET
句で定義されている属性を参照できますが、同じ文で定義されている属性を参照できます。
構文が表示されるように、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の例
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に役立ちます。)
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)
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回のみカウントされます。