row_number : Use o número da linha em suas consultas
Autor: Fabiano Cores | Publicado: 2011-05-25T17:51:00-03:00

Durante o desenvolvimento de um layout de exportação de dados por arquivo texto, utilizei uma ferramenta muito prática do Transact-SQL, que gostaria de compartilhar aqui no meu blog. A função ROW_NUMBER é utilizada para retornar o número da linha dentro da consulta, de acordo com o “partition_by” e o “order_by” informados. Vamos ver a estrutura da função: &nbsp;     ROW_NUMBER () OVER ( [ &lt;partition_by_clause&gt; ] &lt;order_by_clause&gt; )      &nbsp; [ &lt;partition_by_clause&gt; ]   Este parâmetro não é obrigatório. Permite especificar o particionamento da numeração da linha. É um agrupamento, que permitirá que a numeração seja sempre iniciada a cada mudança do agrupamento / particionamento. &lt;order_by_clause&gt;  Determina qual será a ordenação das linhas do select na atribuição da numeração. A ordenação da função row_number não precisa necessariamente ser a mesma ordenação do select principal onde a função ROW_NUMBER foi aplicada. A função irá retornar um BIGINT com o respectivo número da linha. Vamos então para a parte prática!  Crie a seguinte tabela e execute uma carga de exemplo:     create table exemplo_rn (   funcao char(15) null , nome char(15) null ) &nbsp; insert into exemplo_rn ( funcao, nome ) values ( &#39;PROGRAMADOR&#39; , &#39;JOAO&#39; ) insert into exemplo_rn ( funcao, nome ) values ( &#39;PROGRAMADOR&#39; , &#39;MARIA&#39; ) insert into exemplo_rn ( funcao, nome ) values ( &#39;PROGRAMADOR&#39; , &#39;MARCOS&#39; ) insert into exemplo_rn ( funcao, nome ) values ( &#39;PROGRAMADOR&#39; , &#39;VERIDIANA&#39; ) &nbsp; insert into exemplo_rn ( funcao, nome ) values ( &#39;ANALISTA&#39; , &#39;IGOR&#39; ) insert into exemplo_rn ( funcao, nome ) values ( &#39;ANALISTA&#39; , &#39;PEDRO&#39; ) &nbsp; insert into exemplo_rn ( funcao, nome ) values ( &#39;COORDENADOR&#39; , &#39;OSVALDO&#39; )     &nbsp; Nós vamos utilizar como exemplo uma pequena tabela, que possui função e nome de colaboradores. Claro, reduzimos apenas às colunas que nos interessa para exemplificarmos. Vamos então consultar nossa tabela de exemplo: &nbsp;     select * from exemplo_rn      &nbsp;   &nbsp; Então nós temos 7 linhas no total. Vamos agora retornar uma terceira coluna, que trará automaticamente o número da linha: &nbsp;     select funcao, nome, row_number() over ( order by nome ) as &#39;ID&#39;   from exemplo_rn  order by nome      &nbsp;   &nbsp; A coluna ID é resultado da função row_number(). Neste primeiro exemplo, utilizamos a ordenação alfabética da coluna “nome” como condição de numeração das linhas. Observe que a ordenação dentro da cláusula OVER () e a ordenação do select principal não estão diretamente interligadas, porém a ordenação dentro de OVER() é obrigatória: &nbsp;     select funcao, nome, row_number() over ( order by funcao, nome ) as &#39;ID&#39;   from exemplo_rn  order by funcao, nome      &nbsp;   &nbsp; Neste segundo exemplo, a numeração foi feita através da ordenação da função e nome, na respectiva ordem. O próximo exemplo mostra a utilização de PARTITION_BY, condicionando a numeração das linhas ao agrupamento de respectivos campos: &nbsp;     select funcao      , nome      , row_number() over ( partition by funcao order by nome ) as &#39;ID&#39;   from exemplo_rn  order by funcao     &nbsp;   &nbsp; Observe no resultado que a numeração da linha foi feita para cada agrupamento utilizado.  &nbsp; =)