2009-01-27 100 views
0
Patient 
------- 
PatientID 

Visit 
----- 
VisitID 
PatientID 
HeartRate 
VisitDate 

如何選擇全部誰擁有一遊,他們第一訪問的日期,並在他們的心臟率患者第一次訪問?查詢幫助的LINQ到SQL過多最近

+0

我想有一個病人和訪問之間一對多的關係? – Nicolai 2009-01-27 15:37:54

回答

7
SELECT 
    p.PatientID, 
    v.VisitID, 
    v.HeartRate, 
    v.VisitDate 
FROM 
    Patient p 
    INNER JOIN Visit v ON p.PatientID = v.PatientID 
WHERE 
    v.VisitDate = (
    SELECT MIN(VisitDate) 
    FROM Visit 
    WHERE PatientId = p.PatientId 
) 

編輯:另類版本。一樣。 (不太明顯,因此不太理想恕我直言)

SELECT 
    p.PatientID, 
    v.VisitID, 
    v.HeartRate, 
    v.VisitDate 
FROM 
    Patient p 
    INNER JOIN Visit v ON p.PatientID = v.PatientID 
    INNER JOIN (
    SELECT PatientID, MIN(VisitDate) VisitDate 
    FROM Visit 
    GROUP BY PatientID 
) f ON f.PatientID = p.PatientID AND f.VisitDate = v.VisitDate 
-1
SELECT TOP(1) PatientID, VisitDate, HeartRate FROM Visit ORDER BY VisitDate ASC 

病人只有PatientID?不是一個名字或類似的東西?

+0

我只發佈患者的相關專欄。無論如何,我需要第一次訪問:< – Shawn 2009-01-27 15:38:24

+0

然後它會是這樣的。 – 2009-01-27 15:42:17

+0

難道他不想讓所有的就診患者? – 2009-01-27 15:43:40

1

這是你想要的嗎? 當然,因爲在Patient中沒有額外的字段,所以這裏並不是真正必要的。但我猜IRL有。

select PatientId, HeartRate, VisitDate from Patient p 
left join Visit v on p.PatientID = v.PatientId 
1

最後的查詢

declare @practiceID int 
select 
    isnull(sum(isResponder),0) as [Responders], 
    isnull(count(*) - sum(isResponder),0) as [NonResponders] 
from ( 
    select 
     v.patientID 
     ,firstVisit.hbLevel as startHb 
     ,maxHbVisit.hblevel as maxHb 
     , case when (maxHbVisit.hblevel - firstVisit.hbLevel >= 1) then 1 else 0 end as isResponder 
    from patient p 
     inner join visit v on v.patientid = v.patientid 
     inner join practice on practice.practiceid = p.practiceid 
     inner join (
      SELECT 
       p.PatientID 
       ,v.VisitID 
       ,v.hblevel 
       ,v.VisitDate 
      FROM Patient p 
       INNER JOIN Visit v ON p.PatientID = v.PatientID 
      WHERE 
       v.VisitDate = (
        SELECT MIN(VisitDate) 
        FROM Visit 
        WHERE PatientId = p.PatientId 
       ) 
     ) firstVisit on firstVisit.patientID = v.patientID 
     inner join (
      select 
       p.patientID 
       ,max(v.hbLevel) as hblevel 
      from Patient p 
       INNER JOIN Visit v ON p.PatientID = v.PatientID 
      group by 
       p.patientID 
     ) MaxHbVisit on maxHbVisit.patientid = v.patientId 
    where 
     p.practiceID = isnull(@practiceID, p.practiceID) 
    group by 
     v.patientID 
     ,firstVisit.hbLevel 
     ,maxHbVisit.hblevel 
    having 
     datediff(
      d, 
      dateadd(
       day 
       ,-DatePart(
        dw 
        ,min(v.visitDate) 
       ) + 1 
       ,min(v.visitDate) 
      ) 
      , max(v.visitDate) 
     ) >= (7 * 8) 
) responders