Colega, Absolutamente não é difícil : primeiro, talvez vc tenha pensado em GROUP BY em algum momento (agrupando por JOB_NAME), e isso TOTALMENTE NÃO se encaixa aqui : a questão é o GROUP BY *** faz um "SANDUÍCHE" dos n registros, agrupando os n registros do grupo numa linha só... Nessa linha vc pode ter uma CONTAGEM indicando quantos registros foram agrupados, pode ter um máximo, um mínimo, uma média, etc, MAS o fato é que a informação individual é logicamente eliminada, os N registros do grupo "viraram" um só.... Isso não sendo possível, uma opção interessante é nós (dentro dos dados ordenados por JOB_NAME), usarmos alguma alguma funcionalidade que atribua (digamos) 1 para a primeira linha do JOB_NAME sendo lido, 2 para a segunda execução, 3 para a terceira, etc, E QUE quando mudar de JOB_NAME resete a contagem.... Aí ficaria MUITO FÁCIL, é só perguntar no WHERE para filtrar esse "número de linha dependente do JOB_NAME" .... Tal funcionalidade existe há MUUUUITO TEMPO (desde as priscas eras do Oracle 8i), e é dada pelas funções analíticas - que, claro, servem para OUTRAS coisas também... Na verdade, sempre que vc quer "processar a linha anteriormente lida" - no seu caso para saber se mudou de JOB_NAME -, a primeira coisa que se pensa é em alguma função analítica... Vamos a um exemplinho (com os MEUS dados, no MEU database, que obviamente não vão ser os mesmos que o seus) : =>primeiro, vamos ver os dados brutos, só ordenados :
SYSTEM@o10gr2:SQL>SELECT JOB_NAME, STATUS, LOG_DATE FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS' order by job_name, log_date; JOB_NAME STATUS LOG_DATE ------------------------- ---------- -------------------------------- RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:19:43,712000 -03:00 RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:41:15,008000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 13:55:58,362000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 14:41:14,720000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 15:41:14,803000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 16:41:14,959000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 17:41:14,106000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 19:20:49,353000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 19:41:14,698000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 23/07/13 20:19:43,962000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 13:55:58,939000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 14:53:34,171000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 15:51:10,220000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 16:48:46,115000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 17:46:22,135000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 19:20:50,180000 -03:00 16 linhas selecionadas. ==> legal : como eu falei acima, vamos Classificar , dar um número, para cada linha com o mesmo JOB_NAME : SYSTEM@o10gr2:SQL>SELECT JOB_NAME, STATUS, LOG_DATE, RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS'; JOB_NAME STATUS LOG_DATE NUM_DA_EXEC ------------------------- ---------- -------------------------------- ----------- RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:19:43,712000 -03:00 1 RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:41:15,008000 -03:00 2 RLM$EVTCLEANUP SUCCEEDED 24/07/13 13:55:58,362000 -03:00 3 RLM$EVTCLEANUP SUCCEEDED 24/07/13 14:41:14,720000 -03:00 4 RLM$EVTCLEANUP SUCCEEDED 24/07/13 15:41:14,803000 -03:00 5 RLM$EVTCLEANUP SUCCEEDED 24/07/13 16:41:14,959000 -03:00 6 RLM$EVTCLEANUP SUCCEEDED 24/07/13 17:41:14,106000 -03:00 7 RLM$EVTCLEANUP SUCCEEDED 24/07/13 19:20:49,353000 -03:00 8 RLM$EVTCLEANUP SUCCEEDED 24/07/13 19:41:14,698000 -03:00 9 RLM$SCHDNEGACTION SUCCEEDED 23/07/13 20:19:43,962000 -03:00 1 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 13:55:58,939000 -03:00 2 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 14:53:34,171000 -03:00 3 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 15:51:10,220000 -03:00 4 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 16:48:46,115000 -03:00 5 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 17:46:22,135000 -03:00 6 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 19:20:50,180000 -03:00 7 16 linhas selecionadas. => Taí, EXATAMENTE o que queríamos : o RANK indica que vc vai ter uma classificação dentro de um contador, o PARTITION BY JOB_NAME indica que o contador vai ser em cima da coluna JOB_NAME (ier, assim que mudar o JOB_NAME o contador é zerado, voltando a 1 no próximo JOB_NAME), e dentro de cada JOB_NAME as linhas devem ser ordenadas por LOG_DATE, é o que o ORDER BY faz, e essa "coluna" com o ranking, com a classificação da linha dentro de cada JOB_NAME eu chamei de NUM_DA_EXEC.... Agora é babinha , para ter apenas as 5 primeiras linhas dentro de cada JOB_NAME é só pedir NUM_DA_EXEC < 6 , olha aí : SYSTEM@o10gr2:SQL>select * from ( SELECT JOB_NAME, STATUS, LOG_DATE, RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS' ) where NUM_DA_EXEC < 6; JOB_NAME STATUS LOG_DATE NUM_DA_EXEC ------------------------- ----------- --------------------------------- ----------- RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:19:43,712000 -03:00 1 RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:41:15,008000 -03:00 2 RLM$EVTCLEANUP SUCCEEDED 24/07/13 13:55:58,362000 -03:00 3 RLM$EVTCLEANUP SUCCEEDED 24/07/13 14:41:14,720000 -03:00 4 RLM$EVTCLEANUP SUCCEEDED 24/07/13 15:41:14,803000 -03:00 5 RLM$SCHDNEGACTION SUCCEEDED 23/07/13 20:19:43,962000 -03:00 1 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 13:55:58,939000 -03:00 2 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 14:53:34,171000 -03:00 3 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 15:51:10,220000 -03:00 4 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 16:48:46,115000 -03:00 5 10 linhas selecionadas. E veja que eu POSSO SIM pedir num WHERE uma coluna que não é exibida, então se quiser eu Poderia Sim ao invés de exibir tudo optar por Não Exibir a coluna de classificação , veja : SYSTEM@o10gr2:SQL>select JOB_NAME, STATUS, LOG_DATE from ( SELECT JOB_NAME, STATUS, LOG_DATE, RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS' ) where NUM_DA_EXEC < 6; JOB_NAME STATUS LOG_DATE ------------------------- ----------- --------------------------------- RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:19:43,712000 -03:00 RLM$EVTCLEANUP SUCCEEDED 23/07/13 20:41:15,008000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 13:55:58,362000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 14:41:14,720000 -03:00 RLM$EVTCLEANUP SUCCEEDED 24/07/13 15:41:14,803000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 23/07/13 20:19:43,962000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 13:55:58,939000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 14:53:34,171000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 15:51:10,220000 -03:00 RLM$SCHDNEGACTION SUCCEEDED 24/07/13 16:48:46,115000 -03:00 10 linhas selecionadas. valews ?? Espero que esta abordagem passo-a-passo, mostrando as diferentes "fases" da escrita de um SQl, tenha te sido útil, e que vc passe a contar com uma ferramentinha a mais na sua caixa de ferramentas de programação... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Rafael Mendonca <raffaell.ti77@...> escreveu > > SELECT to_char(log_date, 'DD-MON-YY HH24:MI:SS') TIMESTAMP, job_name, status, > SUBSTR(additional_info, 1, 300) ADDITIONAL_INFO > FROM dba_scheduler_job_run_details > where owner = 'XUXA' > ORDER BY log_date desc; > > > Pessoal, eu queria que essa consulta me retornasse as últimas 5 execuções por > nome do JOB. Com essa consulta ele me mostra tudo. > Alguém poderia ajudar? > > [As partes desta mensagem que não continham texto foram removidas] >