Database
 sql >> Base de Dados >  >> RDS >> Database

Como numerar linhas no SQL

Problema:


Você gostaria de dar a cada linha na tabela de resultados um número separado.

Exemplo:


Nosso banco de dados tem uma tabela chamada furniture com dados nas seguintes colunas:code (chave primária) e name .
código nome
101 cama
202 sofá
333 cadeira
123 estante
235 tabela
766 mesa

Os furniture table armazena o nome dos móveis que queremos numerar.

Solução:

SELECT ROW_NUMBER() OVER() AS num_row,
  code, 
  name
FROM furniture;

A consulta retorna o número da linha de cada móvel junto com seu nome e código:
num_row nome código
1 cama 101
2 sofá 202
3 cadeira 333
4 estante 123
5 tabela 235
6 mesa 766

Observe que os nomes dos móveis não são classificados.

Discussão:


Se você quiser numerar cada linha em um conjunto de resultados, o SQL fornece o ROW_NUMBER() função. Esta função é usada em um SELECT cláusula com outras colunas. Após o ROW_NUMBER() cláusula, chamamos a OVER() função. Se você passar algum argumento para OVER , a numeração das linhas não será classificada de acordo com nenhuma coluna. Assim, a ordem das linhas exibidas será não determinística; na maioria dos casos, é a ordem em que os registros foram inseridos na tabela. A numeração das linhas começa em 1. Em nosso exemplo, cada registro tem um número de 1 a 6.

Também podemos atribuir números de linha usando uma coluna. No exemplo abaixo, numeramos os registros ordenados por nome. Fazemos isso passando esse argumento para OVER junto com ORDER BY (ordena os registros de acordo com a coluna de nome):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture;

Ao observar o conjunto de resultados, você vê as linhas classificadas com seus números:
linha nome código
1 cama 101
2 estante 123
3 cadeira 333
4 mesa 766
5 sofá 202
6 tabela 235

A numeração fornecida por ROW_NUMBER() é independente da ordem das linhas na tabela de resultados. No exemplo abaixo, numeramos os registros usando o nome da coluna classificada (OVER(ORDER BY name) ), mas exibimos registros no conjunto de resultados de acordo com outra coluna (em nosso exemplo, ORDER BY code ).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code;

A consulta retornou o número de cada linha, mas esses números não estão em ordem crescente, pois os registros são classificados de acordo com o código da coluna:
linha nome código
1 cama 101
2 estante 123
5 sofá 202
6 tabela 235
3 cadeira 333
4 mesa 766

A ordem padrão das linhas classificadas é crescente, mas você também pode classificar em ordem decrescente usando o DESC palavra-chave após o nome da coluna pela qual você deseja classificar:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code DESC;

A consulta acima retornou o conjunto de resultados:
linha nome código
4 mesa 766
3 cadeira 333
6 tabela 235
5 sofá 202
2 estante 123
1 cama 101