Ajuda SELECT/Firebird

Olá a todos! :o

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:

Dada a tabela EXAME, com os seguintes campos:

ID (integer) NM_PACIENTE (varchar) DT_EXAME (timestamp)
necessito fazer um SELECT que retorne apenas os exames mais atuais do paciente, tendo como condição a data do exame.

exemplo:

[code]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
[/code]

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.

Agradeço qualquer ajuda.

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.

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.

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 :slight_smile:

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

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 

Help-me Please!