Partilhar via


GROUPPARTITION (SQL de entidade)

Retorna uma coleção de valores de argumento projetados na partição de grupo atual à qual a agregação está relacionada. O GroupPartition agregado é um agregado baseado em grupo e não tem forma baseada em coleção.

Sintaxe

GROUPPARTITION( [ALL|DISTINCT] expression )

Argumentos

expression Qualquer expressão Entity SQL.

Observações

A consulta a seguir produz uma lista de produtos e uma coleção de quantidades de linha de ordem por cada produto:

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

As duas consultas a seguir são semanticamente iguais:

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

O GROUPPARTITION operador pode ser usado em conjunto com funções agregadas definidas pelo usuário.

GROUPPARTITION é um operador de agregado especial que contém uma referência ao conjunto de entrada agrupado. Essa referência pode ser usada em qualquer lugar da consulta em que GROUP BY esteja no escopo. Por exemplo:

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

Com um regular GROUP BY, os resultados do agrupamento são ocultos. Você só pode usar os resultados em uma função agregada. Para ver os resultados do agrupamento, você precisa correlacionar os resultados do agrupamento e do conjunto de entrada usando uma subconsulta. As duas consultas a seguir são equivalentes:

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

Como visto no exemplo, o operador de agregado GROUPPARTITION torna mais fácil obter uma referência ao conjunto de entrada após o agrupamento.

O operador GROUPPARTITION pode especificar qualquer expressão Entity SQL na entrada do operador quando você usa o expression parâmetro.

Por exemplo, todas as seguintes expressões de entrada para a partição de grupo são válidas:

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

Exemplo

O exemplo a seguir mostra como usar a cláusula GROUPPARTITION com a cláusula GROUP BY. A cláusula GROUP BY agrupa SalesOrderHeader entidades pelo seu Contact. Em seguida, a cláusula GROUPPARTITION projeta a TotalDue propriedade para cada grupo, resultando em uma coleção de decimais.

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;