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