Opa, então : Óbvio, o GROUP BY "comum" é CLARO que não serve, ele transforma N 
linhas em uma só ("ensanduícha", "comprime", como eu dizia pros meus alunos) e 
te dá UM valor-resultado, que pode ser a SOMA, a Média, o MAX/MIN, 
absolutamente não é isso que vc quer, vc NÂO quer trabsformar as N linhas numa 
só...
 Aí, não sendo possível usar os comandos built-in da sua tool cliente e/ou tool 
ou linguagem de programação (sqlplus, sql developer, toad e várias outras 
possuem comandos nativos pra sua necessidade), tendo que ser em SQL apenas 
então vc pode pesquisar que entre as funções básicas/escalares do RDBMS Oracle 
que NENHUMA vai te ajudar : o fato é que vc quer uma lógica que DEPENDA do 
valor exibido na linha anterior do resultset, pois vc só quer exibir o valor de 
uma dada coluna-chave a primeira vez, e as funções básicas só 
trabalham/enxergam o registro atual.... 
  SEMPRE que vc precisa de uma lógica que tenha que levar em conta o registro 
anterior e/ou o próximo registro em SQL apenas no RDBMS Oracle (sem lançar mão 
de PL/SQL), vc VAI TER que usar uma função analítica, se é desejado trabalhar 
em SQL apenas.... 
Exemplo :

create table TB_TESTE(
  coluna1 varchar2(5),
  coluna2 number,
  coluna3 number,
  coluna4 number
  );
  
insert into TB_TESTE values('XXXXX',1,15,200);
insert into TB_TESTE values('XXXXX',2,16,202);
insert into TB_TESTE values('XXXXX',3,13,205);
insert into TB_TESTE values('XXXXX',4,14,505);
insert into TB_TESTE values('YYYYY',1,25,300);
insert into TB_TESTE values('YYYYY',2,26,302);

commit;

select * from TB_TESTE;

==> eis o resultado :

COLUNA1     COLUNA2    COLUNA3    COLUNA4
-------  ---------- ---------- ----------
XXXXX             1         15        200
XXXXX             2         16        202
XXXXX             3         13        205
XXXXX             4         14        505
YYYYY             1         25        300
YYYYY             2         26        302

 6 linhas selecionadas 
 
 O que eu preciso é "mostrar" pro sql se a ocorrência corrente do valor na 
coluna1 é a primeira ou não, e se não for a primeira eu "oculto"/mostro um 
NULL... LOGICAMENTE, a ROWNUM não serve porque ela mostra o número de linha 
geral da query, a gente precisa mostrar o número de linha para o 'grupo' de 
registros da chave XXXXX, depois zerar esse contador quando o valor mudar.... 
Isso pode ser assim :
 
 select coluna1, coluna2, coluna3, coluna4, row_number()  over (partition by 
coluna1 order by coluna1) NUM from TB_TESTE;
 
COLUNA1    COLUNA2    COLUNA3    COLUNA4        NUM
------- ---------- ---------- ---------- ----------
XXXXX            1         15        200          1
XXXXX            2         16        202          2
XXXXX            3         13        205          3
XXXXX            4         14        505          4
YYYYY            1         25        300          1
YYYYY            2         26        302          2

 6 linhas selecionadas 
 
 Tá vendo como agora sim fui capaz de dizer se é a primeira ocorrência ou não 
do valor-chave ?? Fica ** trivial ** meter um CASE e perguntar isso :
 

SELECT CASE WHEN NUM=1 THEN COLUNA1 ELSE NULL END as COLUNA1, coluna2, coluna3, 
coluna4 
   FROM (select coluna1, coluna2, coluna3, coluna4, row_number()  over 
(partition by coluna1 order by coluna1) NUM from TB_TESTE) ;
    
COLUNA1    COLUNA2    COLUNA3    COLUNA4
------- ---------- ---------- ----------
XXXXX            1         15        200
                 2         16        202
                 3         13        205
                 4         14        505
YYYYY            1         25        300
                 2         26        302

6 linhas selecionadas 

[]s

  Chiappa
  • [ora... Mario Rodrigues marioirodrig...@gmail.com [oracle_br]
    • ... Vitor Junior vitorj...@gmail.com [oracle_br]
      • ... 'Fernando Franquini 'capin'' fernando.franqu...@gmail.com [oracle_br]
    • ... 'Schiavini' et...@schiavini.inf.br [oracle_br]
      • ... Mario Rodrigues marioirodrig...@gmail.com [oracle_br]
        • ... jlchia...@yahoo.com.br [oracle_br]
          • ... Mario Rodrigues marioirodrig...@gmail.com [oracle_br]
    • ... Nino ninoba...@gmail.com [oracle_br]

Responder a