2010-07-19 4 views
4

이전 게시물에서는 "doctor", "patient"및 "visit"의 3 개 테이블로 구성된 매우 간단한 데이터베이스를 수행했습니다. 나는 그것을 더 현실적으로 만들고 "의사"와 "환자"사이에 많은 관계를 포함 시키려고 노력했다. "방문"은이 n-m 관계를 초래하는 테이블입니다. 내 테이블에 대해 다음과 같은 간단한 구조를 가정SQL 쿼리에 대한 도움말

 
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 의사를 가지고 : 나는 다음과 같은 데이터를 사용하고

 
doctor 
- idDoctor 
- name 

patient 
-idPatient 
-name 
-dob 

visit 
-idVisit 
-idPatient 
-idDoctor 
-timestamp 

있는 내가 쿼리를 만들고 싶어. 예를 들어, 환자 1은 의사 1, 의사 2를 한 명, 의사 3 명을 1 번보기 위해 두 번갔습니다.

각 부부 (의사, 환자)에 대해 마지막 방문을하도록 요청하고 싶습니다. . 환자가 의사 1에게 지불 한 마지막 방문이 20시 10 분에 14시 10 분이 아니기 때문에이 쿼리는 id 방문수 (2,3,4,5,6,7)를 반환하고 1이 아닌 값을 반환해야합니다. 내가 어떻게 할 수 있니?

정말 감사드립니다. SQL을 사용하기 시작할 때 디자인을 향상시키는 데 정말로 도움이됩니다. 그 가정이

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이 지원하는 경우, 할 수없는 경우

+0

어떤 데이터베이스를 사용하고 있습니까? SQL Server, Oracle, MySQL 또는 다른 어떤 것? –

+0

일부 datbase에서는 예약어 일 수 있으므로 열 타임 스탬프는 지정하지 않습니다. – HLGEM

답변

4

가정 ID는 당신이

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

를 "속임수"수 연대기 순서로 할당

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

+0

@Frustrated - 네, 그렇습니다. 현실 세계에서는 그렇지 않습니다. –

+0

두 번째 솔루션은 완벽하게 작동합니다! 많은 감사합니다! – am38

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

오라클 a nalytics 대답 :

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

나는 틀린 것일 수도 있지만'max (timestampVisit)'와 관련된'idVisit'보다는'max (timestampVisit)'를 반환하겠습니까? –