1

この問題の文脈は、病院への訪問です。ロジックは少し複雑ですが、これらは要件です。

  • 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
4

2 に答える 2