Запросите помощь для человека, который в последнее время слишком часто использует Linq-to-Sql - PullRequest
0 голосов
/ 27 января 2009
Patient 
-------
PatientID

Visit
-----
VisitID
PatientID
HeartRate
VisitDate

Как выбрать всех пациентов, которые посещают, дату их первого посещения и частоту сердечных сокращений на этом первом посещении?

Ответы [ 4 ]

7 голосов
/ 27 января 2009
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 голос
/ 27 января 2009

Финальный запрос

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
1 голос
/ 27 января 2009

Это то, что вы хотите? Конечно, объединение здесь не обязательно, так как в Patient нет дополнительных полей. Но я думаю, что IRL есть.

select PatientId, HeartRate, VisitDate from Patient p
left join Visit v on p.PatientID = v.PatientId
0 голосов
/ 27 января 2009
SELECT TOP(1) PatientID, VisitDate, HeartRate FROM Visit ORDER BY VisitDate ASC

Пациент имеет только PatientID? Не имя или что-то в этом роде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...