Podemos dar um exemplo simples.
Considere uma tabela nomeada TableA
com os seguintes valores:
id firstname lastname Mark
-------------------------------------------------------------------
1 arun prasanth 40
2 ann antony 45
3 sruthy abc 41
6 new abc 47
1 arun prasanth 45
1 arun prasanth 49
2 ann antony 49
GROUP BY
A cláusula SQL GROUP BY pode ser usada em uma instrução SELECT para coletar dados em vários registros e agrupar os resultados por uma ou mais colunas.
Em palavras mais simples, a instrução GROUP BY é usada em conjunto com as funções agregadas para agrupar o conjunto de resultados por uma ou mais colunas.
Sintaxe:
SELECT expression1, expression2, ... expression_n,
aggregate_function (aggregate_expression)
FROM tables
WHERE conditions
GROUP BY expression1, expression2, ... expression_n;
Podemos aplicar GROUP BY
em nossa tabela:
select SUM(Mark)marksum,firstname from TableA
group by id,firstName
Resultados:
marksum firstname
----------------
94 ann
134 arun
47 new
41 sruthy
Na nossa tabela real, temos 7 linhas e, quando aplicamos GROUP BY id
, o servidor agrupa os resultados com base em id
:
Em palavras simples:
aqui GROUP BY
normalmente reduz o número de linhas retornadas, acumulando-as e calculando Sum()
para cada linha.
PARTITION BY
Antes de ir para PARTITION BY, vejamos a OVER
cláusula:
De acordo com a definição do MSDN:
A cláusula OVER define uma janela ou um conjunto de linhas especificado pelo usuário em um conjunto de resultados da consulta. Uma função de janela calcula um valor para cada linha na janela. Você pode usar a cláusula OVER com funções para calcular valores agregados, como médias móveis, agregados acumulados, totais em execução ou um N superior por resultados de grupo.
PARTITION BY não reduzirá o número de linhas retornadas.
Podemos aplicar PARTITION BY em nossa tabela de exemplos:
SELECT SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname FROM TableA
Resultado:
marksum firstname
-------------------
134 arun
134 arun
134 arun
94 ann
94 ann
41 sruthy
47 new
Veja os resultados - ele particionará as linhas e retornará todas as linhas, ao contrário de GROUP BY.