A Função OVER (PARTITION BY) em SQL: Um Guia Completo
- #SQL Server
- #SQL
As funções de janela (window functions) têm revolucionado a forma como os dados são analisados em SQL. Entre elas, a cláusula OVER (PARTITION BY)
se destaca por sua versatilidade e capacidade de fornecer insights detalhados sem a necessidade de consultas complexas e subconsultas. Este artigo explora a fundo a função OVER (PARTITION BY)
, sua sintaxe, uso, e exemplos práticos.
O Que é a Função OVER (PARTITION BY)
?
A cláusula OVER (PARTITION BY)
é usada em conjunto com funções de janela para definir a partição de linhas sobre as quais a função deve ser aplicada. Essencialmente, ela permite dividir um conjunto de resultados em partições menores, onde cálculos específicos podem ser realizados.
Sintaxe
A sintaxe básica da função OVER (PARTITION BY)
é a seguinte:
<função_de_janela> OVER (PARTITION BY <coluna1>, <coluna2>, ...)
Aqui, <função_de_janela>
pode ser qualquer função de janela, como ROW_NUMBER()
, RANK()
, SUM()
, AVG()
, entre outras. A cláusula PARTITION BY
é seguida por uma ou mais colunas que determinam como os dados serão particionados.
Funções de Janela Comuns Usadas com OVER (PARTITION BY)
1. ROW_NUMBER() - A função ROW_NUMBER()
atribui um número sequencial único a cada linha dentro da partição.
SELECT
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as row_num,
employee_name,
department,
salary
FROM
employees;
Neste exemplo, os empregados são particionados pelo departamento e numerados de acordo com o salário, em ordem decrescente.
2. RANK() - A função RANK()
atribui uma classificação a cada linha dentro da partição, com possíveis lacunas em caso de empates.
SELECT
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank,
employee_name,
department,
salary
FROM
employees;
Aqui, cada empregado recebe uma classificação com base no salário dentro de seu departamento.
3. SUM() - A função SUM()
calcula a soma acumulada dentro de cada partição.
SELECT
department,
employee_name,
salary,
SUM(salary) OVER (PARTITION BY department ORDER BY employee_name) as cumulative_salary
FROM
employees;
Neste caso, o salário acumulado é calculado para cada departamento.
4. LAG() e LEAD() - As funções LAG()
e LEAD()
acessam dados de linhas anteriores e posteriores dentro da partição, respectivamente.
SELECT
employee_name,
department,
salary,
LAG(salary, 1) OVER (PARTITION BY department ORDER BY salary) as previous_salary,
LEAD(salary, 1) OVER (PARTITION BY department ORDER BY salary) as next_salary
FROM
employees;
Aqui, LAG()
obtém o salário da linha anterior e LEAD()
obtém o salário da linha seguinte, dentro do mesmo departamento.
Vantagens do Uso de OVER (PARTITION BY)
- Eficiência: Reduz a necessidade de subconsultas complexas.
- Flexibilidade: Permite cálculos avançados dentro de partições definidas pelo usuário.
- Clareza: Facilita a leitura e manutenção do código SQL.
Considerações Finais
A cláusula OVER (PARTITION BY)
é uma ferramenta poderosa no arsenal de qualquer desenvolvedor ou analista de dados que trabalha com SQL. Ela oferece uma forma eficiente e clara de realizar cálculos complexos em conjuntos de dados particionados, tornando a análise de dados mais intuitiva e acessível.
Ao dominar essa função, você pode aprimorar significativamente suas habilidades de SQL e oferecer insights mais profundos e precisos a partir dos seus dados. Experimente os exemplos fornecidos neste artigo e explore as diversas possibilidades que a função OVER (PARTITION BY)
tem a oferecer.
Ass. Gabriel Siqueira de Lima