我有一個病人表:我希望我能存在關聯關係的「內嵌視圖」
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
本質上,患者將在分子中具有1,如果具有用於測量甲的至少一個值和一個VA在這個例子中,患者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
這個工作過程,只要我不包括相關性,日期限制預期(錄音< DATEADD( hh,12,被承認)。不幸的是,以這種方式關聯'內聯視圖'在語法上不是有效的。
這迫使我重新寫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
我的問題:是否有更好的,更有效的方式來做到這一點?
謝謝你的時間。
克雷格的做法:0時01分45秒 – craig 2009-11-13 17:09:22