У меня есть стол пациента:
PatientId Admitted
--------- ---------------
1 d/m/yy hh:mm:ss
2 d/m/yy hh:mm:ss
3 d/m/yy hh:mm:ss
У меня есть таблица измерения пациента (от 0 до многих):
PatientId MeasurementId Recorded Value
--------- ------------- --------------- -----
1 A d/h/yy hh:mm:ss 100
1 A d/h/yy hh:mm:ss 200
1 A d/h/yy hh:mm:ss 300
2 A d/h/yy hh:mm:ss 10
2 A d/h/yy hh:mm:ss 20
1 B d/h/yy hh:mm:ss 1
1 B d/h/yy hh:mm:ss 2
Я пытаюсь создать результирующий набор, похожий на:
PatientId Numerator Denominator
--------- -------- -----------
1 1 1
2 1 1
3 0 1
По существу, у пациента будет 1 в числителе, если у него есть хотя бы одно значение для измерения A и одно значение для измерения B. В этом примере пациент 1 имеет 3 измерения A и 2 B измерения, поэтому числитель 1. У пациента 2 есть 2 измерения A, но нет измерений B, поэтому числитель равен 0. У пациента нет ни измерений A, ни измерения B, поэтому числитель равен 0.
Мой запрос на данный момент:
SELECT PatientId, CASE WHEN a.cnt+b.cnt>2 THEN 1 ELSE 0 END Numerator, 1 Denominator
FROM patient p
LEFT OUTER JOIN (
SELECT PatientId, count(*) cnt
FROM PatientMeasurement pm
WHERE MeasurementId='A'
--AND Recorded <= dateadd(hh, 12, Admitted)
GROUP BY PatientId
) a ON p.PatientId=a.PatientId
LEFT OUTER JOIN (
SELECT PatientId, count(*) cnt
FROM PatientMeasurement pm
WHERE MeasurementId='B'
--AND Recorded <= dateadd(hh, 12, Admitted)
GROUP BY PatientId
) b ON p.PatientId=b.PatientId
Это работает, как и ожидалось, до тех пор, пока я не включу коррелированное ограничение даты (Записано
Это заставило меня переписать SQL на:
SELECT PatientId, CASE WHEN v.a+v.b>2 THEN 1 ELSE 0 END Numerator, 1 Denominator
FROM (
SELECT PatientId,
(
SELECT PatientId, count(*) cnt
FROM PatientMeasurement pm
WHERE PatientId=p.PatientId
AND MeasurementId='A'
AND Recorded <= dateadd(hh, 12, Admitted)
GROUP BY PatientId
) a,
(
SELECT PatientId, count(*) cnt
FROM PatientMeasurement pm
WHERE PatientId=p.PatientId
AND MeasurementId='B'
AND Recorded <= dateadd(hh, 12, Admitted)
GROUP BY PatientId
) b
FROM Patient p
) v
Мой вопрос: есть ли лучший, более эффективный способ сделать это?
Спасибо за ваше время.