Com a cláusula OVER você faz com que uma janela de registros passe por alguns cálculos.

Entenda por janela de registros como sendo uma quantidade de registros no qual o cálculo será realizado.

Ao contrário do GROUP BY, onde o retorno é de apenas uma linha para cada agrupamento realizado, com a cláusula OVER você consegue trabalhar no contexto do SELECT, ou seja, para cada registro da sua lista. Desta forma, você não precisa trabalhar com o GROUP BY e ainda tem como retorno o cálculo desejado.

Um exemplo de uso do OVER:

SELECT orderid, custid, val,
SUM(val) OVER() AS Total,
SUM(val) OVER(PARTITION BY custid) AS TotalPorCliente
FROM Sales.OrderValues;

Retorna os seguintes registros:

orderid     custid      val          Total            TotalPorCliente
----------- ----------- ------------ ---------------- ---------------
10643       1           814.50       1265793.22       4273.00
10692       1           878.00       1265793.22       4273.00
10702       1           330.00       1265793.22       4273.00
10835       1           845.80       1265793.22       4273.00
10952       1           471.20       1265793.22       4273.00
11011       1           933.50       1265793.22       4273.00
10926       2           514.40       1265793.22       1402.95
10759       2           320.00       1265793.22       1402.95
10625       2           479.75       1265793.22       1402.95
10308       2           88.80        1265793.22       1402.95
10365       3           403.20       1265793.22       7023.98
...
(830 row(s) affected)

Notem somatório das duas últimas colunas… O que o SQL fez foi exibir a soma em cada registro.

Se o OVER não existisse, você inevitavelmente precisaria realizar duas consultas: Uma para listar os registros individualmente e uma segunda com os totalizadores, usando o GROUP BY.

No próximo post vou falar sobre as funções de ranqueamento da cláusula OVER.

Até!