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;