Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como ROW_NUMBER() funciona no SQL Server


No SQL Server, o ROW_NUMBER() A função permite numerar a saída de um conjunto de resultados. Ele retorna o número sequencial de cada linha, começando em 1.

Se você especificar partições para o conjunto de resultados, cada partição fará com que a numeração comece novamente (ou seja, a numeração começará em 1 para a primeira linha em cada partição).


Sintaxe


A sintaxe fica assim:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

PARTITION BY value_expression é opcional. Ele divide o conjunto de resultados produzido pelo FROM cláusula em partições às quais a função é aplicada. expressão_valor especifica a coluna pela qual o conjunto de resultados é particionado. Se a PARTITION BY cláusula não for especificada, todas as linhas do conjunto de resultados da consulta serão tratadas como um único grupo.

É necessário. Ele determina a sequência na qual as linhas recebem seu ROW_NUMBER exclusivo dentro de uma partição especificada.

Observe que o OVER A cláusula normalmente aceita uma cláusula , mas esse argumento não pode ser usado com esta função.

Exemplo 1 – Uso básico


Aqui está um exemplo básico mostrando como essa função funciona:
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Linha', AlbumId, AlbumNameFROM Álbuns;

Resultado:
+-------+-----------+-------------------------- +| Linha | AlbumId | AlbumName ||-------+-----------+--------------------------| | 1 | 1 | Powerslave || 2 | 2 | Potência || 3 | 3 | Cantando na Rua || 4 | 4 | Ziltoid, o Onisciente || 5 | 5 | Vítimas de Cool || 6 | 6 | Epicloud || 7 | 7 | Em algum lugar no tempo || 8 | 8 | Pedaço de espírito || 9 | 9 | Assassinos || 10 | 10 | Nenhuma oração para os moribundos || 11 | 11 | Sem som sem silêncio || 12 | 12 | Grande cara de balanço || 13 | 13 | Noite Azul || 14 | 14 | Eternidade || 15 | 15 | Escandinávia || 16 | 16 | Mala perdida há muito tempo || 17 | 17 | Louvor e Culpa || 18 | 18 | Junto veio Jones || 19 | 19 | Toda a Noite Errada || 20 | 20 | Os Dezesseis Homens de Tain || 21 | 21 | Ei Wassup || 22 | 22 | Preso |+-------+-----------+--------------------------+ 

Nesse caso, podemos ver que os números das linhas se alinham perfeitamente com os valores no AlbumId coluna. Isso é mera coincidência. Isso acontece porque o AlbumId coluna está usando um valor de incremento começando em 1, que também é o que ROW_NUMBER() usa.

A numeração das linhas está correlacionada com o AlbumId coluna na medida em que é ordenado por essa coluna. Mas isso não significa que os valores precisam ser os mesmos.

Exemplo 2 – Adicionar uma cláusula WHERE


Adicionando um WHERE cláusula irá demonstrar o que quero dizer.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsWHERE AlbumId> 15;

Resultado:
+-------+-----------+----------+ | Linha | AlbumId | AlbumName ||-------+-----------+-------------------------|| 1 | 16 | Mala perdida há muito tempo || 2 | 17 | Louvor e Culpa || 3 | 18 | Junto veio Jones || 4 | 19 | Toda a Noite Errada || 5 | 20 | Os Dezesseis Homens de Tain || 6 | 21 | Ei Wassup || 7 | 22 | Preso |+-------+-----------+-------------------------+ 

Exemplo 3 – Mudar a ordenação


Ordenar por ordem decrescente em vez de ascendente também demonstra este conceito.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId DESC) 'Row', AlbumId, AlbumNameFROM Albums;

Resultado:
+-------+-----------+-------------------------- +| Linha | AlbumId | AlbumName ||-------+-----------+--------------------------| | 1 | 22 | Preso || 2 | 21 | Ei Wassup || 3 | 20 | Os Dezesseis Homens de Tain || 4 | 19 | Toda a Noite Errada || 5 | 18 | Junto veio Jones || 6 | 17 | Louvor e Culpa || 7 | 16 | Mala perdida há muito tempo || 8 | 15 | Escandinávia || 9 | 14 | Eternidade || 10 | 13 | Noite Azul || 11 | 12 | Grande cara de balanço || 12 | 11 | Sem som sem silêncio || 13 | 10 | Nenhuma oração para os moribundos || 14 | 9 | Assassinos || 15 | 8 | Pedaço de espírito || 16 | 7 | Em algum lugar no tempo || 17 | 6 | Epicloud || 18 | 5 | Vítimas de Cool || 19 | 4 | Ziltoid, o Onisciente || 20 | 3 | Cantando na Rua || 21 | 2 | Potência || 22 | 1 | Powerslave |+-------+-----------+--------------------------+ 

Exemplo 4 – Ordenar por uma coluna diferente


E já que estamos nisso, vamos ordenar pelo AlbumName coluna em vez disso.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Linha', AlbumId, AlbumNameFROM Álbuns;

Resultado:
+-------+-----------+-------------------------- +| Linha | AlbumId | AlbumName ||-------+-----------+--------------------------| | 1 | 19 | Toda a Noite Errada || 2 | 18 | Junto veio Jones || 3 | 12 | Grande cara de balanço || 4 | 13 | Noite Azul || 5 | 22 | Preso || 6 | 5 | Vítimas de Cool || 7 | 6 | Epicloud || 8 | 14 | Eternidade || 9 | 9 | Assassinos || 10 | 16 | Mala perdida há muito tempo || 11 | 10 | Nenhuma oração para os moribundos || 12 | 11 | Sem som sem silêncio || 13 | 8 | Pedaço de espírito || 14 | 2 | Potência || 15 | 1 | Powerslave || 16 | 17 | Louvor e Culpa || 17 | 15 | Escandinávia || 18 | 3 | Cantando na Rua || 19 | 7 | Em algum lugar no tempo || 20 | 20 | Os Dezesseis Homens de Tain || 21 | 21 | Ei Wassup || 22 | 4 | Ziltoid, o Onisciente |+-------+-----------+------------------------- -+

Exemplo 5 – Partições


Como mencionado, você também pode dividir os resultados em partições. Ao fazer isso, a numeração começa em 1 novamente para cada nova partição.

Exemplo:
SELECT Genre, ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsINNER JOIN Gêneros ON Albums.GenreId =Genres.GenreId;

Resultado:
+---------+-------+-----------+---------------- ----------+| Gênero | Linha | AlbumId | AlbumName ||---------+-------+-----------+----------------- ---------|| País | 1 | 3 | Cantando na Rua || País | 2 | 21 | Ei Wassup || País | 3 | 22 | Preso || Jazz | 1 | 12 | Grande cara de balanço || Jazz | 2 | 19 | Toda a Noite Errada || Jazz | 3 | 20 | Os Dezesseis Homens de Tain || Pop | 1 | 11 | Sem som sem silêncio || Pop | 2 | 13 | Noite Azul || Pop | 3 | 14 | Eternidade || Pop | 4 | 15 | Escandinávia || Pop | 5 | 16 | Mala perdida há muito tempo || Pop | 6 | 17 | Louvor e Culpa || Pop | 7 | 18 | Junto veio Jones || Rocha | 1 | 1 | Powerslave || Rocha | 2 | 2 | Potência || Rocha | 3 | 4 | Ziltoid, o Onisciente || Rocha | 4 | 5 | Vítimas de Cool || Rocha | 5 | 6 | Epicloud || Rocha | 6 | 7 | Em algum lugar no tempo || Rocha | 7 | 8 | Pedaço de espírito || Rocha | 8 | 9 | Assassinos || Rocha | 9 | 10 | Nenhuma oração para os moribundos |+---------+-------+-----------+----------------- -------------+

Mais uma vez podemos ver que o ROW_NUMBER e o AlbumId colunas são completamente não correlacionadas.

Neste caso eu particiono pelo Genre coluna. Isso faz com que a numeração comece em 1 novamente para cada gênero.