Compartilhar via


PARTIÇÃODOGRUPO (Entity SQL)

Retorna uma coleção de valores de argumento que são projetados fora do partição atual do grupo que a agregação está relacionada. A agregação de GroupPartition é uma agregação grupo- base e não tem nenhum formulário coleção com base.

Sintaxe

GROUPPARTITION( [ALL|DISTINCT] expression )

Argumentos

expression Qualquer expressão Entity SQL.

Comentários

A seguinte consulta gerencia uma lista de produtos e uma coleção de linha quantidades do pedido por cada produto:

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

As duas consultas são iguais semanticamente:

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 operador de GROUPPARTITION pode ser usado em conjunto com funções agregadas definidas pelo usuário.

GROUPPARTITION é um operador aggregate especial que contém uma referência ao conjunto agrupado de entrada. Essa referência pode ser usada em qualquer lugar na consulta onde o PERTO GRUPO está no escopo. Por exemplo:

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

Com um GROUP BY regular, os resultados do agrupamento ficam ocultos. Você pode usar os resultados em uma função agregada. Para ver os resultados de agrupamento, você precisa correlacionar os resultados de agrupamento e de entrada definidos usando um subconsulta. As duas consultas 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 mostrado no exemplo, o operador aggregate de GROUPPARTITION facilita obter uma referência a entrada definida após o agrupamento.

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

Por exemplo todas as expressões da seguir de entrada 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 de GROUPPARTITION com o cláusula GROUP BY. O cláusula GROUP BY agrupa entidades de SalesOrderHeader pelo seu Contact. A cláusula de GROUPPARTITION projetos na propriedade de TotalDue 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;