Aprenda PL/SQL

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
  

Mensagemem Seg, 29 Ago 2016 11:00 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

Código: Selecionar todos
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
Dualogic

Mensagemem Seg, 29 Ago 2016 2:29 pm

Boa tarde,

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

por exemplo:

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?
spernega
Localização: São Paulo - SP

Mensagemem Seg, 29 Ago 2016 5:36 pm

isso, exatamente isso,
só não entendi essa parte d.dt_incl, qual parâmetro devo passar ?
Dualogic

Mensagemem Ter, 30 Ago 2016 7:46 am

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:
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.
spernega
Localização: São Paulo - SP

Mensagemem Ter, 30 Ago 2016 9:13 am

Olá,

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

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 :(
Dualogic

Mensagemem Ter, 30 Ago 2016 9:21 am

Tem como você gerar um script com a criação das tabelas e as cargas?
dai eu tento reproduzir aqui.
spernega
Localização: São Paulo - SP

Mensagemem Ter, 30 Ago 2016 9:28 am

Você quer um script do meu banco ?
Dualogic

Mensagemem Ter, 30 Ago 2016 9:32 am

Só das tabelas envolvidas na query.
Com os inserts, se não for muito grande+
spernega
Localização: São Paulo - SP

Mensagemem Ter, 30 Ago 2016 9:51 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
Dualogic

Mensagemem Ter, 30 Ago 2016 9:58 am

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.
spernega
Localização: São Paulo - SP

Mensagemem Ter, 30 Ago 2016 9:58 am

Uma das tabelas desta query possui 136008 registros
Dualogic

Mensagemem Ter, 30 Ago 2016 9:59 am

é muita coisa,

Se conseguir, manda só os scripts mesmo
spernega
Localização: São Paulo - SP

Mensagemem Ter, 30 Ago 2016 12:46 pm

Opa!

Tenta assim:

Código: Selecionar todos
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
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante