2009-01-27 7 views

Répondre

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 
) 

EDIT: version alternative. Même chose. (Moins évident, donc moins souhaitable à mon humble avis)

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 
+0

hrmm c'est proche de ce que j'avais, j'espérais qu'il y avait une meilleure façon cependant. merci beaucoup – Shawn

+0

Je ne pense pas qu'il existe un "meilleur" moyen de le faire. Cependant vous définissez cela. Si vous voulez dire "sans utiliser une sous-requête" ... Vous pouvez ajouter un INNER JOIN par rapport à "(SELECT PatientID, MIN (VisitDate) FROM Visiter le groupe BY PatientID)". Mais c'est juste la sous-requête déguisée. – Tomalak

+0

plus pour que vous vous joigniez au combo patientID/date de visite. mais je pense que c'est la seule façon – Shawn

-1
SELECT TOP(1) PatientID, VisitDate, HeartRate FROM Visit ORDER BY VisitDate ASC 

Le patient a-t-il uniquement PatientID? Pas un nom ou quelque chose comme ça?

+0

J'ai seulement posté les colonnes pertinentes du patient. Quoi qu'il en soit, j'ai besoin de la première visite: < – Shawn

+0

Ensuite, ce serait quelque chose comme ça. –

+0

Ne veut-il pas tous les patients avec des visites? –

1

Est-ce ce que vous cherchez? Bien sûr, la jointure n'est pas vraiment nécessaire ici car il n'y a pas de champs supplémentaires dans Patient. Mais je suppose qu'il y a IRL.

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

désolé ened la première visite. et ce serait une jointure interne; p – Shawn

+0

La requête est la même, mais ajoutez un 'TRI PAR VisitDate DESC GROUP BY PatientId'. – workmad3

1

La requête finale

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