
Função Row Number no SQL Server
A função ROW_NUMBER() no SQL Server, introduzida na versão de SQL Server 2005, é uma ferramenta poderosa para atribuir um número sequencial a cada linha em um conjunto de resultados. Essa função é particularmente útil em cenários onde é necessário identificar e manipular linhas com base em sua ordem ou em grupos específicos de dados. A cláusula ORDER BY é obrigatória para definir a ordem em que os números de linha são atribuídos, enquanto a cláusula PARTITION BY é opcional e resetará a contagem para um (1) cada vez que a partição mudar. Um dos casos de uso mais eficazes da função ROW_NUMBER() é a deleção de linhas duplicadas, mantendo apenas uma ou um número específico de ocorrências, o que facilita a manutenção da integridade e limpeza dos dados em tabelas.
A Função ROW_NUMBER()
A função ROW_NUMBER() retorna um número sequencial para cada linha, começando em um (1). Ela exige a cláusula ORDER BY para determinar a ordem de atribuição dos números e pode usar a cláusula PARTITION BY para reiniciar a contagem em subconjuntos de dados. Quando a cláusula PARTITION BY é utilizada, a numeração sequencial é reiniciada para um (1) sempre que a partição mudar, o que é útil para análises e manipulações de dados em grupos específicos.
A função ROW_NUMBER() foi introduzida no SQL Server 2005. Ela retorna o número sequencial de uma linha começando em um. A cláusula Order By é obrigatória. A cláusula Partition By é opcional. Quando os dados são particionados, o número da linha é resetado para um quando a partição muda.
Sintaxe e Exemplo Básico
A sintaxe básica para ROW_NUMBER() é ROW_NUMBER() OVER (ORDER BY coluna)
.
Por exemplo, ao selecionar funcionários e adicionar um número de linha ordenado por gênero:
SELECT Nome, Genero, Salario, ROW_NUMBER() OVER (ORDER BY Genero) AS NumeroLinha FROM Funcionarios;
Este comando adiciona uma coluna "NumeroLinha" que atribui um número sequencial a cada linha, baseado na ordem alfabética do gênero. A cláusula ORDER BY é fundamental, pois sem ela, o SQL Server retornará um erro, pois a função precisa de uma ordem para gerar os números sequenciais de forma consistente.
Uso com PARTITION BY
A cláusula PARTITION BY permite que a numeração seja reiniciada para cada grupo de dados. Se particionarmos os dados por gênero e ordenarmos por gênero, o número da linha será reiniciado para cada gênero:
SELECT Nome, Genero, Salario, ROW_NUMBER() OVER (PARTITION BY Genero ORDER BY Genero) AS NumeroLinha FROM Funcionarios;
Neste caso, as linhas para funcionários do gênero "Feminino" terão números de 1 a N, e as linhas para funcionários do gênero "Masculino" também começarão de 1 a N, com a contagem reiniciada para cada partição.
Quando os dados são particionados, observe as primeiras quatro linhas, isso é a partição de funcionários femininos, então o número da linha começou em 1 e foi até 4, e aqui estamos mudando a partição de feminino para masculino, então na linha de número cinco, observe o que aconteceu com o número da linha, ele foi resetado para 1. E então ele vai até seis, então sempre que a partição muda, o número da linha é resetado para 1.
Caso de Uso: Deletar Linhas Duplicadas
Um dos usos mais práticos da função ROW_NUMBER() é a exclusão de linhas duplicadas, mantendo apenas uma ocorrência. Isso é frequentemente realizado em conjunto com Common Table Expressions (CTEs).
Suponha que temos uma tabela Funcionarios
com várias linhas duplicadas. Para remover todos os duplicados, exceto um, podemos usar o seguinte script:
WITH EmployeeCTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ID, Nome, Genero, Salario ORDER BY ID) AS NumeroDaLinha FROM Funcionarios ) DELETE FROM EmployeeCTE WHERE NumeroDaLinha > 1;
Esta CTE cria uma partição para cada conjunto de colunas (ID, Nome, Gênero, Salário) e atribui um número de linha. Em seguida, a instrução DELETE remove todas as linhas onde o NumeroDaLinha
é maior que 1, efetivamente deixando apenas uma ocorrência de cada registro duplicado. Se a intenção for manter duas duplicatas, a condição pode ser alterada para WHERE NumeroDaLinha > 2
.
Este método é eficiente e seguro para garantir a unicidade dos registros em uma tabela, sendo uma técnica comum em tarefas de limpeza e manutenção de dados.
Takeaways
- Introdução e Requisito: A função ROW_NUMBER(), introduzida no SQL Server 2005, atribui um número sequencial a cada linha. A cláusula ORDER BY é obrigatória para definir a ordem de numeração, sem ela a consulta retornará um erro.
- PARTITION BY (Opcional): A cláusula PARTITION BY é opcional e reinicia a contagem da ROW_NUMBER() para 1 sempre que os valores nas colunas especificadas na partição mudam, permitindo a numeração dentro de grupos de dados.
- Deleção de Duplicatas: Um dos principais casos de uso da ROW_NUMBER() é a remoção de linhas duplicadas, mantendo apenas uma (ou um número específico) ocorrência. Isso é feito particionando os dados pelas colunas que definem a duplicidade e excluindo as linhas com
NumeroDaLinha > 1
dentro de uma CTE (Common Table Expression). - Flexibilidade na Deleção: Ao usar a ROW_NUMBER() para remover duplicatas, é possível ajustar a condição (por exemplo,
NumeroDaLinha > 2
) para manter um número específico de registros duplicados, se necessário.
References
© 2025 ClarifyTube. All rights reserved.