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 |