这个问题的背景是医院就诊。逻辑有点复杂,但这些是要求。
- 表访问包含患者的姓名和访问 ID。
- 表 FilteredVisits 包含满足某些条件的某些访问
该报告在特定日期范围内运行 - 这很重要。假设 2013 年 1 月 1 日到 2013 年 1 月 31 日
- 如果在该日期范围内 FilteredVisits 中存在访问,则报告会为该访问显示 1。否则,它返回 0。
- 但是,如果在日期范围之前(在我们的示例中,在 2013 年 1 月 1 日之前)在 FilteredVisits 中存在该患者(姓名 1)的条目,则该患者的所有就诊都需要为 1,无论其他就诊是否'FilterVisits 表中不存在。
- PatientID 和 VisitID 都是唯一值。
- 该报告仅输出日期范围内的患者和访问
请参阅下面的示例。
目前,代码正在对存储结果的临时表进行 2 次单独更新(2 次传递)。一个更新将所选日期范围的值设置为 0/1,然后另一个更新在开始日期参数之前搜索所有内容。FilteredVisits 表可能很大,有没有办法优化它以更快?
表 1 所有患者就诊
PatientNameID VisitID
-------------------
PatientName1 P1Visit1
PatientName1 P1Visit2
PatientName1 P1Visit3
PatientName2 P2Visit1
PatientName3 P3Visit1
PatientName3 P3Visit2
表 2 过滤的访问
PatientNameID VisitID Date
-------------------------
PatientName1 P1Visit1 12/1/2012
PatientName1 P1Visit3 1/2/2013
PatientName3 P3Visit1 1/8/2013
结果:
Results
PatientName1 P1visit1 1
PatientName1 P1visit2 1 -- would be '0' but there was a visit by PatientName1 BEFORE the date range so set to 1
PatientName1 P1visit3 1
PatientName2 P2visit1 0
PatientName3 P3visit1 1
PatientName3 P3Visit2 0 -- this stays 0 because there is no entry of PatientName3 visit3 in table2 and no visit by PatientName3 prior to the selected date range
-- 编辑:TempTable 仅包括所选日期范围内的患者和就诊
-- First pass
UPDATE t
SET MeasureIsTrue = 1
FROM TempTable t
INNER JOIN FilteredVisits fv ON fv.visitID = t.visitID
-- Second pass
UPDATE t
SET MeasureIsTrue = 1
FROM TempTable t
INNER JOIN FilteredVisits fv ON fv.PatientID = t.PatientID -- join on patientID to include all visits
AND fv.visitDate < @BeginDate -- search only before date range