AGREGAÇÃO EM WINDOW FUNCTION

Neste post quero mostrar como é completamente intuitivo e simples utilizar funções de agregação com o recurso de w.f

A grande diferença quando utilizamos este recurso é que podemos dispensar o uso da cláusula group by ao final da query

Como sabemos, sempre que vamos fazer mão do recurso de w.f precisamos declarar a cláusula over na query a ser executada. O resultado desejado irá variar dos parâmetros que iremos passar para ela. 

Se quisermos que haja um particionamento, devemos declarar o partition by do contrário, não. Lembrando que o ORDER BY aqui não é obrigatório.

Vamos aos exemplos:

No primeiro exemplo, uma query simples com duas funções de agregação. Reparem que não precisamos declarar GROUP BY

Até poderíamos utilizar a forma normal, com a função de agrupamento e a cláusula group by ao final, porém, é considerado uma boa prática, sempre que possível claro, evitar o uso de group by em queries. 

Agora, temos um exemplo do que acontece quando utilizamos agregação com partition by. A query retorna o total de cada pedido e na outra coluna, temos a soma do total geral.

Essa soma do total geral foi possível e fácil de realizar pois não aplicamos nenhuma cláusula de ordenamento ou partição. Logo o SQL Server entende que é para todo o grupo.

No exemplo abaixo, veja como é mais ‘clean’ trabalhar com agregações e W.F em SQL e este ainda reforça o quão versátil é o uso das CTE.

AGREGAÇÃO DISTINTA

Sabemos que é possível utilizar funções de agregação com window function facilitando a visualização de dados e performance das queries. Porém, o que vimos no post anterior foram queries apenas com resultados que mostravam valores repetidos, mas e se quisermos usar distinct e visualizar apenas os valores únicos??

Por padrão o SQL Server não aceita que usemos distinct em algumas funções de agregação junto com a cláusula over em seguida. Normalmente, precisamos de soluções de contorno quando queremos nos valer deste recurso, por exemplo: 

Como vimos, há o retorno de erro na execução. Então, no próximo exemplo, irei mostrar a primeira solução.

Esta solução foi elaborada em duas fases sendo a primeira, criando uma query onde atribuímos um valor para cada linha (envolvida em preto), valor baseado na coluna customerID e logo após colocamos esta query dentro de uma C.T.E

Na segunda query, chamando esta C.T.E, com uma função de COUNT que ao final, retorna apenas um único pedido feito num determinado dia de acordo com a coluna customerID

DIFERENÇA ENTRE QUERY AGRUPADA (GROUP BY) E AGREGADA (W.F)

Quando entramos no campo das window function, ganhamos mais um recurso para agrupar resultados para exibição de uma query que são as queries agregadas. Quando agregamos utilizando W.F o banco pega todos os valores de um registro, realiza a operação, agrupa em um único e por fim, entrega o resultado.

Por exemplo, nesta simples query com group by, temos as compras totais de todos os clientes:

Agora, se quisermos saber o total de todas as compras, uma das formas seria retirar a coluna customerid e deixar somente a soma. Porém com a o recurso abaixo, é possível visualizar tanto o valor das compras por cliente quanto o valor total de todas as compras e

E como podemos ver, a query acima ainda facilita a criação de uma coluna de porcentagem de compra feita por cada cliente.

Este foi um post rápido com o intuito de facilitar o entendimento das funções de agregação com este recurso, além de reforçar a utilidade da W.F. 

Espero que tenham gostado deste post e que ele tenha esclarecido qualquer dúvida quanto a esta parte do conteúdo!

Bom noite e saúde!