GROUPPARTITION (实体 SQL)

返回一个参数值的集合,这些参数值投影自聚合相关的当前组分区。 聚合 GroupPartition 是基于组的聚合,没有基于集合的形式。

语法

GROUPPARTITION( [ALL|DISTINCT] expression )

论据

expression 任何实体 SQL 表达式。

注解

以下查询生成产品列表以及每个产品的订单行数量集合:

SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol
  GROUP BY ol.Product AS p

以下两个查询在语义上相等:

SELECT p, Sum(GroupPartition(ol.Quantity)) FROM LOB.OrderLines AS ol
  GROUP BY ol.Product AS p
SELECT p, Sum(ol.Quantity) FROM LOB.OrderLines AS ol
  group by ol.Product as p

运算符 GROUPPARTITION 可以与用户定义的聚合函数结合使用。

GROUPPARTITION 是一个特殊的聚合运算符,用于保存对分组输入集的引用。 可以在 GROUP BY 所在的查询中的任何位置使用此引用。 例如:

SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p

使用常规 GROUP BY,分组的结果将隐藏。 只能在聚合函数中使用结果。 若要查看分组的结果,必须使用子查询关联分组的结果和输入集的结果。 下面两个查询是等效的:

SELECT p, (SELECT q FROM GroupPartition(ol.Quantity) AS q) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p
SELECT p, (SELECT ol.Quantity AS q FROM LOB.OrderLines AS ol2 WHERE ol2.Product = p) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p

如示例中所示,GROUPPARTITION 聚合运算符使在分组后更容易获取对输入集的引用。

使用参数时 expression ,GROUPPARTITION 运算符可以在运算符输入中指定任何实体 SQL 表达式。

例如,组分区的所有以下输入表达式都有效:

SELECT groupkey, GroupPartition(b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(1) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(a + b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({a + b}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({42}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(b > a) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey

示例:

以下示例演示如何将 GROUPPARTITION 子句与 GROUP BY 子句一起使用。 GROUP BY 子句按实体分组SalesOrderHeaderContact 然后,GROUPPARTITION 子句投影 TotalDue 每个组的属性,从而生成小数的集合。

USING Microsoft.Samples.Entity
Function MyAvg(dues Collection(Decimal)) AS
(
    Avg(SELECT value due FROM dues AS due WHERE due > @price)
)
SELECT TOP(10) contactID, MyAvg(GroupPartition(order.TotalDue)) 
FROM AdventureWorksEntities.SalesOrderHeaders AS order 
GROUP BY order.Contact.ContactID AS contactID;