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).
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] )
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:
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;
Compreender os dois principais componentes da cláusula OVER() é essencial:
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;
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.