Over e Partition By | SQL SERVER
- Over e Partition By | SQL SERVER
No SQL, a cláusula OVER(PARTITION BY) é usada em funções de janela para dividir um conjunto de resultados em partições lógicas. Dentro de cada partição, a função de janela é aplicada, permitindo cálculos como somas, médias, contagens, classificações e muito mais, mas sem reduzir o número de linhas retornadas (ao contrário de uma agregação regular, como GROUP BY).
Sintaxe Geral
<função_de_janela>() OVER (
PARTITION BY <coluna_ou_expressão>
[ORDER BY <coluna_ou_expressão>]
)
PARTITION BY: Divide os dados em grupos (partições) baseados na coluna ou expressão fornecida. As funções de janela são calculadas dentro de cada partição.ORDER BY: Opcionalmente, define a ordem dentro de cada partição, o que é necessário para funções como soma cumulativa, classificação etc.
Exemplo Básico
Considere uma tabela Vendas com as colunas: VendedorID, Ano, Mes, e ValorVenda.
| VendedorID | Ano | Mes | ValorVenda |
|---|---|---|---|
| 1 | 2022 | 1 | 1000 |
| 1 | 2022 | 2 | 1500 |
| 2 | 2022 | 1 | 2000 |
| 2 | 2022 | 2 | 2500 |
1. Soma Cumulativa por Vendedor
Queremos calcular a soma cumulativa de ValorVenda para cada vendedor (VendedorID).
SELECT
VendedorID,
Ano,
Mes,
ValorVenda,
SUM(ValorVenda) OVER (PARTITION BY VendedorID ORDER BY Ano, Mes) AS SomaCumulativa
FROM
Vendas;
Resultado:
| VendedorID | Ano | Mes | ValorVenda | SomaCumulativa |
|---|---|---|---|---|
| 1 | 2022 | 1 | 1000 | 1000 |
| 1 | 2022 | 2 | 1500 | 2500 |
| 2 | 2022 | 1 | 2000 | 2000 |
| 2 | 2022 | 2 | 2500 | 4500 |
2. Média por Partição (VendedorID)
Queremos calcular a média de vendas (ValorVenda) por vendedor.
SELECT
VendedorID,
Ano,
Mes,
ValorVenda,
AVG(ValorVenda) OVER (PARTITION BY VendedorID) AS MediaVendas
FROM
Vendas;
Resultado:
| VendedorID | Ano | Mes | ValorVenda | MediaVendas |
|---|---|---|---|---|
| 1 | 2022 | 1 | 1000 | 1250 |
| 1 | 2022 | 2 | 1500 | 1250 |
| 2 | 2022 | 1 | 2000 | 2250 |
| 2 | 2022 | 2 | 2500 | 2250 |
Diferença entre PARTITION BY e GROUP BY
-
GROUP BY:- Agrupa os dados e reduz o número de linhas no resultado.
- Aplica funções agregadas a cada grupo.
Exemplo:
SELECT
VendedorID,
SUM(ValorVenda) AS TotalVendas
FROM
Vendas
GROUP BY
VendedorID;Resultado:
VendedorID TotalVendas 1 2500 2 4500 -
PARTITION BY:- Não reduz o número de linhas.
- Realiza cálculos em cada linha dentro de uma partição lógica.
Quando Usar PARTITION BY
- Cálculos Cumulativos: Soma, média, contagem, etc., que se acumulam ao longo de um grupo ordenado.
- Ranking e Classificação: Para gerar números de linha (
ROW_NUMBER), rankings (RANK,DENSE_RANK). - Cálculos Comparativos: Diferença entre valores de linhas adjacentes (
LAG,LEAD).
Exemplo Avançado: Ranking
Queremos classificar as vendas por VendedorID e Ano.
SELECT
VendedorID,
Ano,
Mes,
ValorVenda,
RANK() OVER (PARTITION BY VendedorID ORDER BY ValorVenda DESC) AS RankVenda
FROM
Vendas;
Resultado:
| VendedorID | Ano | Mes | ValorVenda | RankVenda |
|---|---|---|---|---|
| 1 | 2022 | 2 | 1500 | 1 |
| 1 | 2022 | 1 | 1000 | 2 |
| 2 | 2022 | 2 | 2500 | 1 |
| 2 | 2022 | 1 | 2000 | 2 |
A cláusula OVER (PARTITION BY) é extremamente poderosa para realizar análises detalhadas em conjuntos de dados complexos, sem perder a granularidade dos dados.