Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

7 de abril de 2025

SQL Server: Como obter linhas específicas do resultado com Row_Number


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.

0 comentários:

Postar um comentário