Skip to main content

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.

VendedorIDAnoMesValorVenda
1202211000
1202221500
2202212000
2202222500

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:

VendedorIDAnoMesValorVendaSomaCumulativa
12022110001000
12022215002500
22022120002000
22022225004500

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:

VendedorIDAnoMesValorVendaMediaVendas
12022110001250
12022215001250
22022120002250
22022225002250

Diferença entre PARTITION BY e GROUP BY

  1. 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:

    VendedorIDTotalVendas
    12500
    24500
  2. 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:

VendedorIDAnoMesValorVendaRankVenda
12022215001
12022110002
22022225001
22022120002

A cláusula OVER (PARTITION BY) é extremamente poderosa para realizar análises detalhadas em conjuntos de dados complexos, sem perder a granularidade dos dados.