Essa função é extremamente útil quando você precisa atribuir um número sequencial a cada linha retornada pela consulta, como quando deseja limitar a quantidade de registros retornados ou criar uma ordenação personalizada.
Neste post, vamos explicar como utilizar a função ROW_NUMBER() no SQL Server e dar exemplos práticos de como ela funciona.
O que é o ROW_NUMBER() no SQL Server?
A função ROW_NUMBER() é usada para atribuir um número único e sequencial a cada linha de um conjunto de resultados. A numeração começa em 1 e é incrementada conforme as linhas são retornadas. Ela pode ser particularmente útil para criar relatórios, paginar resultados ou aplicar filtros de forma mais flexível.
O ROW_NUMBER() exige que você forneça uma cláusula ORDER BY, pois a numeração depende da ordem dos dados. Caso contrário, o SQL Server pode gerar a numeração de forma arbitrária.
A sintaxe básica do ROW_NUMBER() é:
SELECT ROW_NUMBER() OVER (ORDER BY [coluna]) AS RowNum, [outras_colunas] FROM [tabela];
ROW_NUMBER(): Função que gera o número sequencial.
OVER (ORDER BY [coluna]): Define a ordem das linhas. O número será atribuído com base nessa ordem.
RowNum: O alias (nome) dado à coluna que contém os números sequenciais.
Exemplo Prático
Vamos imaginar uma tabela chamada Funcionarios com as colunas ID, Nome e Salario. Suponha que você queira listar todos os funcionários e atribuir um número de linha a cada um deles, baseado no valor do salário (do maior para o menor).
Consulta:
SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios;
A função ROW_NUMBER() é utilizada para gerar um número sequencial, com base na ordenação dos salários em ordem decrescente (ORDER BY Salario DESC).
A consulta retornará uma lista de funcionários, com um número (RowNum) atribuído a cada linha, começando de 1 para o maior salário.
Limitando os Resultados com ROW_NUMBER()
Se você quiser apenas os 5 primeiros funcionários com os maiores salários, pode usar o ROW_NUMBER() em conjunto com uma subconsulta ou CTE (Common Table Expression) para filtrar os resultados. Por exemplo:
Consulta para obter os 5 funcionários com os maiores salários:
WITH FuncComRowNum AS ( SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM FuncComRowNum WHERE RowNum <= 5;
Explicação:
Usamos uma CTE (WITH FuncComRowNum AS (...)) para gerar a coluna RowNum para cada funcionário com base no salário.
Em seguida, filtramos os resultados na consulta principal, utilizando WHERE RowNum <= 5 para retornar apenas os 5 primeiros funcionários.
Usando ROW_NUMBER() para Paginação
Um dos usos mais comuns de ROW_NUMBER() é na paginação de resultados. Suponha que você tenha uma grande quantidade de dados e queira dividir os resultados em páginas de 10 itens. Você pode fazer isso utilizando a função ROW_NUMBER().
Exemplo para paginação de 10 itens por página:
WITH Pagina AS ( SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM Pagina WHERE RowNum BETWEEN 11 AND 20; -- Página 2 (itens 11 a 20)
Explicação:
A CTE Pagina atribui um número de linha a cada funcionário, baseado no ID.
A consulta externa usa WHERE RowNum BETWEEN 11 AND 20 para pegar os registros da 11ª à 20ª linha, representando a segunda página de resultados.
Considerações Finais
A função ROW_NUMBER() oferece uma alternativa poderosa e flexível para atribuir números sequenciais às linhas de uma consulta. Com ela, você pode ordenar dados, implementar paginação e aplicar filtros complexos de maneira eficiente.
A função ROW_NUMBER() é muito útil em diversos cenários, como quando você precisa:
- Ordenar resultados de maneira específica e numerada.
- Realizar paginação de resultados em consultas grandes.
- Trabalhar com filtros baseados em posição de linha.