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

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

前
次
機械翻訳について

GROUP/GROUP BY句

GROUPおよびGROUP BY句は、文の出力をグループ化するためにソース・レコードを結果レコードにマップする方法を指定します。

これらの句を問合せで使用する方法には、次のものがあります:
  • GROUP句を省略すると、各ソース・レコードが独自の結果レコードにマップされます。
  • GROUPでは、すべてのソース・レコードが1つの結果レコードにマップされます。
  • GROUP BY <attributeList>では、リストされた属性の値の組合せによって、ソース・レコードが結果レコードにマップされます。

GROUP句およびGROUP BY句を含む他のグループ機能(MEMBERSCUBEGROUPING SETSなど)も使用できます。 これらの関数の詳細は、この項の後半で説明します。

グループ化用BNF文法

GROUP用のBNF文法表現とグループ関数のファミリは、次のとおりです:
GroupClause ::= GROUP | GROUP BY GroupByList | GROUP BY GroupAll
GroupByList ::= GroupByElement | GroupByList ,  GroupByElement
GroupByElement ::= GroupBySingle | GroupingSets | CubeRollup

GroupingSets ::= GROUPING SETS (GroupingSetList)
GroupingSetList ::=  GroupingSetElement |  GroupingSetList ,  GroupingSetElement
GroupingSetElement ::=  GroupBySingle | GroupByComposite | CubeRollup | GroupAll

CubeRollup ::= {CUBE | ROLLUP} (CubeRollupList)
CubeRollupList ::=  CubeRollupElement |  CubeRollupList ,  CubeRollupElement
CubeRollupElement ::=  GroupBySingle | GroupByComposite

GroupBySingle ::= Identifier | GroupByMembers
GroupByComposite ::= (GroupByCompositeList)
GroupByCompositeList ::= GroupBySingle | GroupByCompositeList, GroupBySingle
GroupByMembers ::= MEMBERS (Identifier | Identifier.Identifier) AS Identifier

GroupAll ::= ()
GroupAllを使用すると、次のようにすべて同等になります:
GROUP = GROUP BY() = GROUP BY GROUPING SETS(())

GROUPのみを指定

GROUP句を使用すると、結果を単一のバケットに集計できます。 BNF文法が示すように、GROUP句は引数を取りません。

たとえば、次の文では、SUM文を使用して、レコード・セット全体に単一の合計が返されます:
RETURN ReviewCount AS 
SELECT SUM(NumReviews) AS NumberOfReviews
FROM ProductState
GROUP

この文は、NumberOfReviewsのレコードを1つ戻します。 値は、NumReviews属性の値の合計です。

GROUP BYの指定

GROUP BYを使用して、グループ化キーについて共通の値を持つバケットに結果を集計できます。 GROUP BY構文は、次のとおりです:
GROUP BY attributeList
ここで、attributeListは単一の属性で、複数の属性のカンマ区切りリスト、GROUPING SETSCUBEROLLUPまたは()を使用して空のグループを指定します。 空のグループは合計を生成します。

ソースおよびローカルに定義された属性でグループ化が許可されます。

注意:

ローカルに定義された属性でグループ化する場合は、その属性は非グループ化属性を参照できず、集計を含めることはできません。 ただし、IN式およびルックアップ式はこのコンテキストで有効です。

すべてのグループ化属性は結果レコードの一部です。 どのグループ化属性でも、NULL値(単一割当属性の場合)または空のセット(複数割当属性の場合)は他の値と同様に扱われます。つまり、ソース・レコードが結果レコードにマップされます。 EQLでのユーザー定義のNULL値処理の詳細は、COALESCEを参照してください。

たとえば、次の属性で構成されるレコードを持つ売上トランザクション・データがあるとします:
{ TransId, ProductType, Amount, Year, Quarter, Region,
  SalesRep, Customer }
次に例を示します。
{ TransId = 1, ProductType = "Widget", Amount = 100.00,
  Year = 2011, Quarter = "11Q1", Region  = "East",
  SalesRep = "J. Smith", Customer = "Customer1" }
EQL文でGROUP BY属性としてリージョンと年を使用する場合、文の結果には、有効で空でないリージョンと年の組合せごとの集計レコードが含まれます。 EQLでは、この例は次のように表現されます:
DEFINE RegionsByYear AS
GROUP BY Region, Year
{ Region, Year }形式の集計結果。次に例を示します:
{ "East", "2010" }
{ "West", "2011" }
{ "East", "2011" }
GROUP BY句では、重複した列を使用できます。 つまり、次の2つの問合せは同等として処理されます:
RETURN Results AS
SELECT SUM(PROMO_COST) AS PR_Cost
FROM SaleState
GROUP BY PROMO_NAME

RETURN Results AS
SELECT SUM(PROMO_COST) AS PR_Cost
FROM SaleState
GROUP BY PROMO_NAME, PROMO_NAME

SELECT式の出力であるGROUP BYの使用方法

GROUP BYキーは、式自体に集計関数が含まれていないかぎり、SELECT式の出力にすることができます。

たとえば、次の構文はGROUP BYの正しい使用方法です:
SELECT COALESCE(Person, 'Unknown Person') AS Person2, ... GROUP BY Person2
次の構文は正しくなく、Sales2には集計関数(SUM)が含まれているため、エラーとなります:
SELECT SUM(Sales) AS Sales2, ... GROUP BY Sales2