← Voltar ao Blog

Dominando Window Functions em SQL: ROW_NUMBER, RANK e DENSE_RANK na Prática

Publicado em: 14/07/2026 16:00 SQL

Indo Além do GROUP BY: Análises Avançadas sem Agrupar Linhas

Quando aprendemos consultas SQL tradicionais, o comando GROUP BY costuma ser a ferramenta principal para resumir dados. No entanto, o GROUP BY possui uma limitação estrutural importante: ele compacta as linhas do resultado, fazendo com que você perca o detalhamento individual de cada registro em troca de um valor consolidado por grupo.

E se você precisar calcular a média salarial de um departamento, mas exibir essa média ao lado de cada funcionário individualmente, mantendo todas as linhas visíveis? Para resolver esse tipo de desafio analítico com extrema elegância e performance, utilizamos as Window Functions (Funções de Janela).

O Que é uma Window Function?

Uma função de janela executa um cálculo em cima de um conjunto de linhas de tabela que possuem alguma relação entre si (chamada de "janela"). Diferente de uma função de agregação comum, a função de janela não agrupa e reduz as linhas do resultado final; cada linha original continua preservada e visível, contendo o resultado do cálculo analítico calculado em sua respectiva janela.

A estrutura sintática básica de uma função de janela utiliza a cláusula OVER():

funcao_analitica() OVER (    [PARTITION BY coluna_particao]    [ORDER BY coluna_ordenacao]    [ROWS frame_clause] )

As Principais Funções de Classificação (Ranking)

Entre as funções de janela mais utilizadas no dia a dia corporativo estão as funções de classificação, essenciais para relatórios de desempenho, top 10 de vendas e desempates:

Exemplo prático comparativo:

SELECT    department_id,    full_name,    salary,    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) as seq_row,    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank_normal,    DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank_dense FROM employees;

Particionamento com PARTITION BY vs. ORDER BY

Compreender os dois principais componentes da cláusula OVER() é essencial:

Exemplo prático de Salário Acumulado por Departamento (Running Total):

SELECT    department_id,    full_name,    salary,    SUM(salary) OVER (PARTITION BY department_id ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as salario_acumulado FROM employees;

Conclusão

Dominar as Window Functions eleva drasticamente o nível técnico de qualquer profissional de banco de dados, permitindo construir consultas analíticas altamente complexas, limpas e performáticas sem a necessidade de subqueries confusas ou tabelas temporárias.