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:
- 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:
- create table exemplo_rn (
- funcao char(15) null
- , nome char(15) null
- )
- insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'JOAO' )
- insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'MARIA' )
- insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'MARCOS' )
- insert into exemplo_rn ( funcao, nome ) values ( 'PROGRAMADOR' , 'VERIDIANA' )
- insert into exemplo_rn ( funcao, nome ) values ( 'ANALISTA' , 'IGOR' )
- insert into exemplo_rn ( funcao, nome ) values ( 'ANALISTA' , 'PEDRO' )
- 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:
- select * from exemplo_rn
Então nós temos 7 linhas no total. Vamos agora retornar uma terceira coluna, que trará automaticamente o número da linha:
- select funcao, nome, row_number() over ( order by nome ) as 'ID'
- from exemplo_rn
- order by nome
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:
- select funcao, nome, row_number() over ( order by funcao, nome ) as 'ID'
- from exemplo_rn
- order by funcao, nome
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:
- select funcao
- , nome
- , row_number() over ( partition by funcao order by nome ) as 'ID'
- from exemplo_rn
- order by funcao
Observe no resultado que a numeração da linha foi feita para cada agrupamento utilizado.
=)
Nenhum comentário:
Postar um comentário