2010-07-19 49 views
4

在之前的Post中,我做了一个非常简单的数据库,其中包含3个表格“doctor”,“patient”和“visit”。我试图让它更现实一点,现在包括了“医生”和“患者”之间的多对多关系。 “访问”是导致这种n-m关系的表格。我认为以下几个简单的结构,我的表:有关SQL查询的帮助

 
doctor 
- idDoctor 
- name 

patient 
-idPatient 
-name 
-dob 

visit 
-idVisit 
-idPatient 
-idDoctor 
-timestamp 

我使用下面的数据我上,我想打一个查询:

 
idVisit idDoctor idPatient timestamp 
1  1   1   2010-07-19 14:10 
2  1   2   2010-07-19 15:10 
3  2   1   2010-07-19 15:10 
4  3   1   2010-07-19 16:10 
5  2   2   2010-07-19 18:10 
6  2   3   2010-07-19 19:10 
7  1   1   2010-07-19 20:10 

我有那么3例和3名医生。例如,患者1去了两次看医生1,一次看医生2和一次看医生3.

我想建立我的请求,以便对于每对夫妇(医生,患者)我有上次访问。这个查询应该返回id访问(2,3,4,5,6,7)而不是1,因为病人付给医生1的最后一次访问是在20:10而不是14:10。我怎么能这样做?

我真的很感谢你的意见和你的帮助。当我开始使用SQL时,它确实帮助我改进设计。

+0

你使用什么数据库? SQL Server,Oracle,MySQL或其他? – 2010-07-19 14:20:45

+0

我不会命名列时间戳,因为它可以是某些数据库中的保留字。 – HLGEM 2010-07-19 19:05:45

回答

4

假设IDS是按时间顺序分配的,你可以 “欺骗”

SELECT MAX(idVisit) AS idVisit, idDoctor, idPatient 
FROM visit 
group by idDoctor, idPatient 

如果这个假设不能进行

SELECT v.idVisit, v.idDoctor, v.idPatient 
FROM visit v 
WHERE NOT EXISTS 
(
    SELECT * FROM visit v2 
    WHERE v2.idDoctor = v.idDoctor 
    AND v.idPatient = v2.idPatient 
    AND v2.timestamp > V.timestamp 
) 

或者,如果你的DBMS支持此,

WITH V AS 
(
SELECT idVisit, idDoctor, idPatient, 
row_number() over(partition by idDoctor, idPatient order by timestamp desc) AS RN 
FROM visit 
) 

SELECT idVisit, idDoctor, idPatient 
FROM V 
WHERE RN=1 
+0

这个假设会使事情变得更容易,但通常在这些系统中,访问可以按照它们发生的顺序进行安排,所以这可能不太现实。 – FrustratedWithFormsDesigner 2010-07-19 14:27:22

+0

@Frustrated - 是的,我同意。在现实世界中情况不太可能如此。 – 2010-07-19 14:28:59

+0

第二种解决方案完美无缺!非常感谢 ! – am38 2010-07-19 14:49:50

1
select v.idVisit, d.idDoctor, d.name as nameDoctor, p.idPatient, p.name as namePatient, v.timestamp as lastVisit 
from visit v 
join doctor d on v.idDoctor = d.idDoctor 
join patient p on v.idPatient = p.idPatient 
where not exists 
    (select 1 from visit where idDoctor = v.idDoctor and idPatient = v.idPatient and timestamp > v.timestamp) 
0

Oracle a nalytics回答:

SELECT idVisit, idDoctor, idPatient, 
     max(timestampVisit) 
     over (partition by idDoctor, idPatient) as timestampVisit 
    FROM visits 
+0

我可能错了,但不会仅仅返回'max(timestampVisit)'而不是'max(timestampVisit)'相关的'idVisit'? – 2010-07-19 14:30:10