Window functions: analítica sem colapsar as linhas
Window functions resolvem uma limitação central do GROUP BY: a perda do detalhe das linhas originais após a agregação.
Com RANK(), ROW_NUMBER(), LAG() e LEAD(), os cálculos analíticos são executados sobre o conjunto de linhas original — sem colapsá-lo. É possível manter o nível de detalhe e acessar o valor calculado na mesma linha.
Um exemplo concreto: calcular o crescimento mês a mês de receita. Com LAG(), é uma expressão na cláusula SELECT:
receita - LAG(receita) OVER (ORDER BY mes) AS variacao_momSem window functions, o mesmo resultado exigiria uma CTE para materializar o mês anterior e um join posterior — mais código e mais pontos de falha.
Casos de uso mais comuns:
- Ranking de clientes ou produtos por métrica —
RANK,DENSE_RANK - Numeração sequencial de registros por grupo —
ROW_NUMBER - Comparação com período anterior ou seguinte —
LAG,LEAD - Totais acumulados —
SUM ... OVER (ORDER BY ...)