1

这个问题的背景是医院就诊。逻辑有点复杂,但这些是要求。

  • 表访问包含患者的姓名和访问 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
4

2 回答 2

3

一口气:

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
 OR (fv.visitID = t.visitID)

不过,在这种情况下,我不介意两次通过,因为它似乎不是性能问题,而且无论哪种方式都有效。由开发商决定。

或者......你在寻找这个:

UPDATE t
SET MeasureIsTrue = 1
FROM TempTable t
INNER JOIN FilteredVisits fv ON fv.visitID = t.visitID
WHERE
 fv.PatientID = t.PatientID -- join on patientID to include all visits
    AND fv.visitDate < @BeginDate -- search only before date range

经过审查,我认为您正在寻找带有摘要信息的患者和访问表之间的 LEFT JOIN。SUM 或 COUNT 或者可能是一个 CASE WHEN VisitDate IS NULL THEN 0 ELSE 1 END with a GROUP BY PatientName。

于 2013-09-16T21:09:14.240 回答
0
UPDATE t
SET MeasureIsTrue = 1
FROM TempTable t
LEFT OUTER JOIN FilteredVisits fv1 ON fv1.visitID = t.visitID
LEFT OUTER JOIN FilteredVisits fv2 ON fv2.PatientID = t.PatientID
WHERE fv1.visitID is not null
   OR fv2.visitDate < @BeginDate -- search only before date range
于 2013-09-16T21:11:10.290 回答