この問題の文脈は、病院への訪問です。ロジックは少し複雑ですが、これらは要件です。
- Table Visits には、患者の名前と visitID が含まれています。
- テーブル FilteredVisits には、いくつかの基準を満たす特定の訪問が含まれています
レポートは特定の日付範囲で実行されます - これは重要です。2013 年 1 月 1 日から 2013 年 1 月 31 日までとします。
- その日付範囲内に FilteredVisits に訪問が存在する場合、レポートにはその訪問の 1 が表示されます。それ以外の場合は、0 を返します。
- ただし、日付範囲より前 (この例では 2013 年 1 月 1 日より前) に FilteredVisits にその患者 (名前 1) のエントリが存在する場合、他の訪問が行われたかどうかに関係なく、その患者のすべての訪問は 1 である必要があります。 FilterVisits テーブルに存在しません。
- PatientID と VisitID はどちらも一意の値です。
- レポートは、日付範囲内の患者と訪問のみを出力します
例については、以下を参照してください。
現在、コードは、結果を格納している一時テーブルに対して 2 つの個別の更新 (2 つのパス) を実行しています。選択した日付範囲の値を 0/1 に設定する 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