Trazer sempre o último resultado

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

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
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

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?
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

isso, exatamente isso,
só não entendi essa parte: Qual parâmetro devo passar ?
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

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.
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

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 :(
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Tem como você gerar um script com a criação das tabelas e as cargas?
dai eu tento reproduzir aqui.
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

Você quer um script do meu banco ?
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Só das tabelas envolvidas na query.
Com os inserts, se não for muito grande+
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

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
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

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.
Dualogic
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 16 Ago 2016 11:36 am

Uma das tabelas desta query possui 136008 registros
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

é muita coisa,

Se conseguir, manda só os scripts mesmo
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

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
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes