Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Torden

Pegando o ultimo valor

Recommended Posts

Ola pessoal do iMasters. No momento eu tenho que desenvolver uma pequena query que me retornara um status especifico que fica registrado em um campo da tabela. não consegui encontrar nada na busca.

 

Ate ai, tranquilo, sem problemas... So que... Essa tabela possui uma trigger atrelada e isso faz com que esse mesmo campo mude.

 

Exemplo.

 

O status ontem era X, hoje passou para Y.

Nessa mudanca, esta trigger gera um registro pra X e outro pra Y, e como já podem ter notado, esse campo e diretamente ligado a data.

 

A minha duvida fica em como pegar o registro somente quando o status mais recente for X, e eu preciso realizar essa busca em SYSDATE - 5 tambem.

 

Muito obrigado pessoal!

 

Código:

 

SELECT percod permissor, decnroser decoder, decfch data_status, decode(decsts,'X','não retornado',decsts) decoder_status
FROM
decode_log
WHERE
decsts = 'X'
AND decfch < (sysdate - 5)
ORDER BY percod ASC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que ...

 

SELECT percod permissor, decnroser decoder, decfch data_status, decode(decsts,'X','não retornado',decsts) decoder_status
FROM
decode_log
WHERE
decsts = 'X'
AND decfch < (sysdate - 5)
AND decfch = (SELECT MAX(decfch )
             FROM
             decode_log dl2
             WHERE dl2.decsts = 'X'
             AND dl2.decfch < (sysdate - 5)) 
ORDER BY percod ASC; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado!

 

Que honra ser respondido logo por um moderador! =)

 

Vou testar aqui, depois posto o retorno, positivo ou negativo.

 

Muito obrigado!

 

Testei aqui a query sugerida pelo motta, e ainda to caindo na mesma questao. Ela pega todos os momentos em que o status da decsts esta como X, e a finalidade dela e pegar somente quando X for o status mais atual...

 

Eu to tentando aqui, mas esta meio dificil, query bem chatinha essa.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Moderador é só um Membro com algumas permissões a mais ...

 

Tenta isto ...

SELECT percod permissor, decnroser decoder, decfch data_status, decode(decsts,'X','não retornado',decsts) decoder_status
FROM
decode_log dl
WHERE
decsts = 'X'
AND decfch < (sysdate - 5)
AND decfch = (SELECT MAX(decfch )
             FROM
             decode_log dl2
             WHERE dl2.percod  = dl.percod 
             AND dl2.decsts = 'X'
             AND dl2.decfch < (sysdate - 5))
ORDER BY percod ASC; 

 

Supondo que percod seja a chave da tabela em questão, vai pegar a maior data de cada chave.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado, mais uma vez, motta!

 

Testei aqui, e ela se aproximou bem do resultado preterido, acho que a falha esta no BIOS na ponta de mesa... haha

 

Essa tabela possui um campo de id que e sequencial... Isso teria alguma utilidade/relevancia para a query em questao?!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia básica é igualar a(s) chave(s) primária(s) do select com a da subquery.

 

Exemplo mais simples

 

Post mais recente por usuário do fórum

 

posts
-----
idusuario (pk)
idpost (pk)
data

 

select idusuario,idpost,data
from posts p1
where p1.idpost = (select max(p2.idpost)
                  from posts p2
                  where p2.idusuario = p1.idusuario)
order by idusuario 

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudou sim, cara, nao tenho como te agradecer o suficiente!

 

Vou deixar isso como truque na manga caso necessite!

 

Obrigado motta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Droga... Ainda nao consigo obter os resultados desejados, ainda escapam alguns que ja mudaram de status...

 

Eu preciso pegar os que possuem o status X a mais de 5 dias e ainda permanecem com esse status X.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

... Eu preciso pegar os que possuem o status X a mais de 5 dias e ainda permanecem com esse status X. ...

 

Não entendi, qual a regra para saber isto ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia motta!

 

Vou dar um exemplo.

 

Um dia o técnico coloca o status do decoder como X ( nao retornado ), só que ele pode alterar isso de acordo com a evolução do caso, para outros status. Porém, eu quero pegar os decoders que não mudaram do status X dentro do periodo de 5 dias.

 

Engraçado é que eu tenho conseguido fazer isso com uma query simples, só que ela me retorna também alguns casos em que o status do decoder já mudou o status.

 

Query em questão:

select percod permissor, decnroser decoder, decfch data_status, decode(decsts,'X','nao retornado',decsts) decoder_status 
from decode_log 
where decsts = 'X'
and(decsts != 'R' or decsts != 'S' or decsts != 'A' or decsts != 'E' or decsts != 'C')
and decfch > (sysdate - 5)
order by decsts desc;

 

Aquela que você sugeriu, está me servindo também, mas em outra ponta.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi terá de ser feito uma subquery.

 

 

select percod permissor, decnroser decoder, decfch data_status, decode(decsts,'X','nao retornado',decsts) decoder_status 
from decode_log dl
where decsts = 'X'
and dl.decfch > (sysdate - 5)
and not exists (select null
               from decode_log dl2
               where dl2.percod = dl.percod 
               and (dl2.decsts in ('R','S','A','E','C')
               and dl2.decfch > (sysdate - 5))
order by decsts desc;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado mais uma vez, Motta!

 

Essa query não funcionou, na verdade, ela não retornou nenhum valor.

 

Vou continuar tentando aqui.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.