私は患者テーブルを持っています:
PatientId Admitted
--------- ---------------
1 d/m/yy hh:mm:ss
2 d/m/yy hh:mm:ss
3 d/m/yy hh:mm:ss
私はPatientMeasurementテーブルを持っています(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
基本的に、測定 A の値が少なくとも 1 つ、測定 B の値が 1 つある場合、患者の分子は 1 になります。この例では、患者 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
これは、相関する日付制限 (Recorded < dateadd(hh, 12, Admitted) を含めない限り、期待どおりに機能します。残念ながら、この方法で「インライン ビュー」を相関させることは、構文的に有効ではありません。
これにより、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
私の質問:これを行うためのより良い、より効率的な方法はありますか?
御時間ありがとうございます。