Não estou conseguindo fazer uma determinada consulta SQL em um banco Firebird, gostaria de pedir ajuda ao pessoal q manda bem em SQL/Firebird para descobrir como fazer o seguinte:
necessito fazer um SELECT que retorne apenas os exames mais atuais do paciente, tendo como condição a data do exame.
exemplo:
id nm_paciente dt_exame===========================
05 João Vicente 17/10/2003 18:00:00
04 João Vicente 17/10/2003 17:55:20
03 João Vicente 17/10/2003 17:30:15
02 Maria Rita 17/10/2003 9:40:30
01 Maria Rita 17/10/2003 9:10:30
com base neste exemplo meu objetivo é que o resultset dessa query fosse povoado somente com as linhas id=05 e id=02, que são os mais atuais.
SELECT
MAX(id) as 'ID',
nm_paciente,
MAX(dt_exame) as 'DT_EXAME'
FROM exame
GROUP BY nm_paciente
provavelmente deve ter alguma forma melhor de fazer isso.
esse MAX(id) é uma gambiarra… se eu colocar o id no GROUP BY, eu tenho nomes duplicados no retorno.
Acredito que o mais correto seria vc ter um id_paciente nesta tabela, não o nome.
Daniel_Quirino_Olive
Bom, não sei como faria isso no SQL para o Interbase. Mas no SQL Server/MySQL você resolveria isso assim:
SQL Server:
select top 10 * from exame
where dt_exame < getDate()
MySQL:
select * from exame
where dt_exame < NOW()
limit 10
Isso lhe retorna os 10 últimos exames feitos.
urubatan
retornar apenas os ids 5 e 2
select * from exame where id in (5,2)
agora apenas os 10 exames mais recentes
select first 10 * from exame order by dt_exame desc
agora os 10 ultimos exames dos pacientes 5 e 2
select first 10 * from exame where id in (5,2) order by dt_exame desc
é isto ai, estes selects funcionam no Interbase ou Firebird, no interbase só do 6.5 em diante, no firebird 1.0 em diante
se quiser pegar os 10 ultimos pulando 5 da para fazer
select first 10 skip 5 * from exame where id in (5,2) order by dt_exame desc
luciano_castilho
Obrigado a todos que responderam a minha dúvida, porém acho que não consegui passar exatamente o que esta pegando, vejam:
:arrow: vamos supor que o resultado abaixo foi gerado pela seguinte SQL:
-> SELECT * FROM EXAME WHERE DT_EXAME >= ‘17/10/2003’
id nm_paciente dt_exame
===========================
05 João Vicente 17/10/2003 18:00:00
04 João Vicente 17/10/2003 17:55:20
03 João Vicente 17/10/2003 17:30:15
02 Maria Rita 17/10/2003 9:40:30
01 Maria Rita 17/10/2003 9:10:30
:arrow: pois bem, agora eu preciso que a SQL retorne os resultados mais atuais desta tabela para os mesmos pacientes, ou seja os registros ID=05 e ID=02, pois o DT_EXAME para eles é respectivamente (17/10/2003 18:00:00) e (17/10/2003 9:40:30). Em outras palavras eu preciso excluir do resultado os registros mais velhos do mesmo paciente e obter somente os últimos (mais novos).
necessáriamente teria que ficar assim:
id nm_paciente dt_exame
===========================
05 João Vicente 17/10/2003 18:00:00
02 Maria Rita 17/10/2003 9:40:30