0

私たちのシステムでは、入院患者が予定外の再入院のために病院に戻ることができる状況があります (これは再入院した病棟によって決まります)。データでは、前回の予約に関して特定の時間内に戻ってきた予定外の再入院を探しています。

だから私は持っているかもしれません:

ジョン・スミス 入院: 2013 年 9 月 20 日、2013 年 9 月 22 日に除隊

次に、予定外の入院の別の記録(特別病棟によって特定されます)は次のとおりです。

ジョン・スミス 入院: 2013 年 9 月 25 日、2013 年 9 月 28 日に除隊

だから私がする必要があるのは、1番目のレコードの退院日と2番目のレコードの入院日のデータの違いを確認することです.日数の違いが7日以内で、その人が予定外の入院病棟に行った場合、このデータを表示します.

すべてのデータを SQL Server に取り込み、すべてのレコードをステップ実行する 1 つのカーソルと、予定外の入院のみに関連するすべてのレコードをステップ実行する入れ子になったカーソルを作成するという考えに基づいています。

ネストされたメイン カーソルのデータを区別する方法は、入院した病棟とその入院 ID (一意) がメイン カーソル レコードと同じではなく、患者 ID が一致していることです。

これは、入院の同じ記録を比較するのではなく、同じ患者の他の入院記録を見て、それが 7 日以内かどうかを確認することを意味します。

私が使用したコードは以下のとおりです。私が抱えている主な問題は、カーソルで datediff 関数を使用することです。

DECLARE C_Admmissions CURSOR FOR
    SELECT PatientID, [admission date], [discharge date], admissionid, [ward code]  
    FROM Admissions

    open C_Admmissions

    FETCH NEXT 
    FROM C_Admmissions into @PatientID, @admissiondate, @dischargedate, @admissionid, @wardcode 

    WHILE @@FETCH_STATUS = 0  
    BEGIN

        DECLARE C_unscheduled_Admmissions CURSOR FOR
        SELECT PatientID, [admission date], [discharge date], admissionid, [ward code]  
        FROM Admissions
        WHERE [ward code] = 'unsch_adm'
        AND admissionid != @admissionid
        AND [PatientID] = @PatientID

        open C_unscheduled_Admmissions

        FETCH NEXT FROM C_unscheduled_Admmissions into @PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2

        WHILE @@FETCH_STATUS = 0  
            BEGIN

              begin     
               if DATEDIFF(DD, @dischargedate, @admissiondate2)<=7

                begin
                insert into unscheduled_admissions values(@PatientID, @admissiondate, @dischargedate, @admissionid, @wardcode)
                end

                begin
                insert into unscheduled_admissions values(@PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2)
                end     
              end   

            FETCH NEXT 
            FROM C_unscheduled_Admmissions into @PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2
            END
        CLOSE C_unscheduled_Admmissions
        DEALLOCATE C_unscheduled_Admmissions

    FETCH NEXT 
    FROM C_Admmissions into @CHI, @admissiondate, @dischargedate, @admissionid, @wardcode
    END
    CLOSE C_Admmissions
    DEALLOCATE C_Admmissions
    END

GO

入院と再入院の値をテーブルに挿入して、取得したデータを確認します。入院を取得する代わりに、再入院を次の行に表示し、7 日以内に (前回の退院日から) すべての入院を表示します。データの同じ行で、入院から退院までの期間が 7 日未満の再入院。

処理はライブ システム上ではなく、私が扱っている合計データ行は約 170,000 です。

私が期待しているのは、コードが与えるべきもののようですが、そうではなく、理由がわかりません。それはおそらく、私が見逃しているロジックで明らかなものです。

アンドリュー

4

1 に答える 1

2

カーソルが1つも必要ないようです。このようなものは、必要なデータを生成する必要があります (ただし、希望する形式ではない可能性があります)。

SELECT *
FROM
   Admissions first
      INNER JOIN
   Admissions readmit
      ON
         first.PatientID = readmit.PatientID AND
         first.AdmissionID < readmit.AdmissionID AND
         DATEDIFF(day,first.[discharge date],readmit.[admission date]) <= 7
WHERE
   readmit.[ward code] = 'unsch_adm'

(データがありません。これはテストされていません)。

元の入院後に再入院が発生したことをまったく確認しないため、元のコードに問題がある可能性があります。first.AdmissionID < readmit.AdmissionID上記では、(小切手の代わりに)それをカバーすると想定しました!=-その行に代替手段がありますfirst.[discharge date] < readmit.[admission date]

DATEDIFF(day,<recent date>,<date in the far past>)

7 未満の負の値が生成されます。

于 2013-09-25T10:09:56.863 に答える