Página 1 de 1

Trazer sempre o último resultado

Enviado: Seg, 29 Ago 2016 11:00 am
por Dualogic
Bom dia Pessoal,

Estou começando a trabalhar com SQL e estou com um problema preciso sempre trazer o último registro de uma tabela no seguinte SQL

Selecionar tudo

select      substr(obter_idade_pf(c.cd_pessoa_fisica, sysdate, 'A'),1,100)qt_idade,   
            substr(obter_nome_paciente_setor(a.nr_seq_paciente),1,60) nm_paciente, 
            substr(obter_nome_medico_setor(a.nr_seq_paciente),1,60) nm_medico, 
            substr(obter_desc_prot_medic(a.nr_seq_paciente),1,255) ds_protoc,  
            obter_checagem_quimioterapia(a.nr_seq_atendimento)status,                
            substr(obter_desc_cid(d.CD_CID),1,200)ds_doenca,
            a.qt_peso             
from     paciente_atendimento a, 
           atendimento_paciente c,
           [b]uop_cid_paciente d[/b]
           where   dt_prevista  between  :dt_inicial and fim_dia(:dt_final)
   and  d.cd_pessoa_fisica = c.cd_pessoa_fisica
   and       exists (select 1 
               from paciente_setor b 
               where b.nr_seq_paciente = a.nr_seq_paciente 
               and b.ie_status = 'A')                        
and          a.dt_cancelamento is null 
and          a.cd_estabelecimento = :cd_estabelecimento
and          a.nr_atendimento = c.nr_atendimento
order by     nm_paciente

preciso que traga somente e sempre o primeiro registro dessa tabela em negrito

Re: Trazer sempre o último resultado

Enviado: Seg, 29 Ago 2016 2:29 pm
por spernega
Boa tarde,

Na tabela uop_cid_paciente você tem algum campo que possa ser usado como parâmetro?

por exemplo:

Selecionar tudo

And d.dt_incl = (Select max(dt_incl) 
from uop_cid_paciente 
where cd_pessoa_fisica = d.cd_pessoa_fisica)

é mais ou menos isso que você quer?

Re: Trazer sempre o último resultado

Enviado: Seg, 29 Ago 2016 5:36 pm
por Dualogic
isso, exatamente isso,
só não entendi essa parte: Qual parâmetro devo passar ?

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 7:46 am
por spernega
Oi,

No exemplo, caso a sua tabela uop_cid_paciente tiver mais que um registro para cada paciente e você quiser trazer sempre o último registro dele, você poderia filtrar pela data de inclusão do registro.
A subquery trará o último registro lançado com base na data de inclusão ou outro campo único que exista na tabela.

Ou seja, você pesquisará apenas as consultas referentes a última entrada do paciente.

Agora uma resposta mais "estranha":
Se você quiser apenas que o select retorne apenas uma linha, você pode incluir mais uma clausula a na query:


-- para trazer o primeito registro que encontra:

Selecionar tudo

where rownum <= 1
and   dt_prevista  between  :dt_inicial and fim_dia(:dt_final)
and   d.cd_pessoa_fisica = c.cd_pessoa_fisica
and   exists (select 1 
              from paciente_setor b 
              where b.nr_seq_paciente = a.nr_seq_paciente 
              and b.ie_status = 'A')                        
and   a.dt_cancelamento is null 
and   a.cd_estabelecimento = :cd_estabelecimento
and   a.nr_atendimento = c.nr_atendimento
order by nm_paciente

Para trazer o último registro você colocaria um order by campo desc

Mas acho que não é isso que você precisa.

De qualquer forma, se der, explique mais detalhadamente o que você precisa.

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:13 am
por Dualogic
Olá,

Dei uma melhorada e uma "enxugada" no meu código e ficou assim,

Selecionar tudo

select   substr(obter_idade_pf(c.cd_pessoa_fisica, sysdate, 'A'),1,100)qt_idade,   
            substr(obter_nome_paciente_setor(a.nr_seq_paciente),1,60) nm_paciente, 
            substr(obter_nome_medico_setor(a.nr_seq_paciente),1,60) nm_medico, 
            substr(obter_desc_prot_medic(a.nr_seq_paciente),1,255) ds_protoc,                  
            substr(obter_desc_cid(d.CD_CID),1,200)ds_doenca,
            a.qt_peso             
from     paciente_atendimento a, 
            atendimento_paciente c,
            uop_cid_paciente d
where   a.dt_prevista  between  :dt_inicial and fim_dia (:dt_final)
and      d.dt_diagnostico = (select max(dt_diagnostico) from uop_cid_paciente where d.cd_pessoa_fisica = c.cd_pessoa_fisica)                
and      a.dt_cancelamento is null 
and      a.cd_estabelecimento = :cd_estabelecimento
and      a.nr_atendimento = c.nr_atendimento
and      d.cd_pessoa_fisica = c.cd_pessoa_fisica


order by     nm_paciente
Porém mesmo informando os parâmetros a consulta sai em branco, e não sei mais o que fazer pra resolver este problema :(

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:21 am
por spernega
Tem como você gerar um script com a criação das tabelas e as cargas?
dai eu tento reproduzir aqui.

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:28 am
por Dualogic
Você quer um script do meu banco ?

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:32 am
por spernega
Só das tabelas envolvidas na query.
Com os inserts, se não for muito grande+

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:51 am
por Dualogic
Volto a dizer, estou iniciando com SQL e conheço pouco das ferramentas para tal, como faço para gerar este script no SQL Navigator 6.1

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:58 am
por spernega
Eu não uso o SQL Navigator, sou da velha guarda, uso só o sqlplus :?

Deve ter opções de gerar DDL das tabelas e os INSERTS , pelo menos no sqldeveloper tem.

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:58 am
por Dualogic
Uma das tabelas desta query possui 136008 registros

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 9:59 am
por spernega
é muita coisa,

Se conseguir, manda só os scripts mesmo

Re: Trazer sempre o último resultado

Enviado: Ter, 30 Ago 2016 12:46 pm
por geovani
Opa!

Tenta assim:

Selecionar tudo

select
   substr(obter_idade_pf(c.cd_pessoa_fisica,sysdate,'A'),1,100) qt_idade,
   substr(obter_nome_paciente_setor(a.nr_seq_paciente),1,60) nm_paciente,
   substr(obter_nome_medico_setor(a.nr_seq_paciente),1,60) nm_medico,
   substr(obter_desc_prot_medic(a.nr_seq_paciente),1,255) ds_protoc,
   substr(obter_desc_cid(d.CD_CID),1,200)mds_doenca,
   a.qt_peso  
from
   paciente_atendimento a,
   atendimento_paciente c,
   uop_cid_paciente d  
where
   a.dt_prevista between :dt_inicial and fim_dia (:dt_final)  
   and d.dt_diagnostico = (
      select
         max(ultimo.dt_diagnostico) 
      from
         uop_cid_paciente ultimo
      where
         d.cd_pessoa_fisica = ultimo.cd_pessoa_fisica
   )  
   and a.dt_cancelamento is null  
   and a.cd_estabelecimento = :cd_estabelecimento  
   and a.nr_atendimento = c.nr_atendimento  
   and d.cd_pessoa_fisica = c.cd_pessoa_fisica