Funções de agregação (Entity SQL)

Uma agregação é um constructo de linguagem que condensa uma coleção em um escalar como parte de uma operação de grupo. As agregações de SQL de entidade vêm em duas formas:

  • Funções de coleção SQL de entidade que podem ser usadas em qualquer lugar em uma expressão. Isso inclui o uso de funções de agregação em projeções e predicados que atuam em coleções. As funções de coleção são o modo preferencial de especificar agregações no Entity SQL.

  • Agrupar agregações em expressões de consulta que têm uma cláusula GROUP BY. Assim como no Transact-SQL, as agregações de grupo aceitam DISTINCT e ALL como modificadores para a entrada de agregação.

A entidade SQL primeiro tenta interpretar uma expressão como uma função de coleção e, se a expressão estiver no contexto de uma expressão SELECT, ela a interpretará como uma agregação de grupo.

O SQL da entidade define um operador de agregação especial chamado GROUPPARTITION. Esse operador permite que você obtenha uma referência ao conjunto de entrada agrupado. Isso permite consultas de agrupamento mais avançadas, em que os resultados da cláusula GROUP BY podem ser usados em locais que não sejam funções de agregação de grupo ou coleção.

Funções de coleção

As funções de coleção operam em coleções e retornam um valor escalar. Por exemplo, se orders for uma coleção de todos orders, você poderá calcular a data de envio mais antiga com a seguinte expressão:

min(select value o.ShipDate from LOB.Orders as o)

Agregações de grupo

As agregações de grupo são calculadas sobre um resultado de grupo, conforme definido pela cláusula GROUP BY. A cláusula GROUP BY particiona dados em grupos. Para cada grupo no resultado, a função de agregação é aplicada e uma agregação separada é calculada usando os elementos em cada grupo como entradas para o cálculo agregado. Quando uma cláusula GROUP BY é usada em uma expressão SELECT, somente nomes de expressão de agrupamento, agregações ou expressões constantes podem estar presentes na cláusula PROJEÇÃO, HAVING ou ORDER BY.

O exemplo a seguir calcula a quantidade média ordenada para cada produto.

select p, avg(ol.Quantity) from LOB.OrderLines as ol

group by ol.Product as p

É possível ter uma agregação de grupo sem uma cláusula GROUP BY explícita na expressão SELECT. Todos os elementos serão tratados como um único grupo, equivalente ao caso de especificar um agrupamento com base em uma constante.

select avg(ol.Quantity) from LOB.OrderLines as ol

select avg(ol.Quantity) from LOB.OrderLines as ol group by 1

As expressões usadas na cláusula GROUP BY são avaliadas usando o mesmo escopo de resolução de nome que seria visível para a expressão da cláusula WHERE.

Consulte também