Pesquisar este blog

quarta-feira, 25 de maio de 2011

row_number : Use o número da linha em suas consultas

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:

 

  1. ROW_NUMBER () OVER ( [ <partition_by_clause> ] <order_by_clause> )

 

[ <partition_by_clause> ]

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.

<order_by_clause>

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:

  1. create table exemplo_rn (
  2.   funcao char(15) null
  3. , nome char(15) null
  4. )
  5.  
  6. insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'JOAO' )
  7. insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'MARIA' )
  8. insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'MARCOS' )
  9. insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'VERIDIANA' )
  10.  
  11. insert into exemplo_rn ( funcao, nome ) values ( 'ANALISTA' , 'IGOR' )
  12. insert into exemplo_rn ( funcao, nome ) values ( 'ANALISTA' , 'PEDRO' )
  13.  
  14. insert into exemplo_rn ( funcao, nome ) values ( 'COORDENADOR' , 'OSVALDO' )

 

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:

 

  1. select * from exemplo_rn

 

image

 

Então nós temos 7 linhas no total. Vamos agora retornar uma terceira coluna, que trará automaticamente o número da linha:

 

  1. select funcao, nome, row_number() over ( order by nome ) as 'ID'
  2.   from exemplo_rn
  3. order by nome

 

image

 

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:

 

  1. select funcao, nome, row_number() over ( order by funcao, nome ) as 'ID'
  2.   from exemplo_rn
  3. order by funcao, nome

 

image

 

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:

 

  1. select funcao
  2.      , nome
  3.      , row_number() over ( partition by funcao order by nome ) as 'ID'
  4.   from exemplo_rn
  5. order by funcao

 

image

 

Observe no resultado que a numeração da linha foi feita para cada agrupamento utilizado.

 

=)