2014-06-18 7 views
1

아래의 레코드 별 레코드를 사용하여 데이터를 업데이트 할 수 없습니다.업데이트 문을 사용하여 필요한 결과를 가져올 수 없습니다.

필수 출력 : 환자가 처음 입원 한 후 병원에 여러 번 재 입원하는 경우 환자가 입원/재 입원을 여러 번 할 수 있으며 첫 방문 기록에는 재 입원 = 0 및 색인 = 1이 표시됩니다. 이 방문은 해당 환자의 Index_Admission을 조정해야합니다. 이 index_admission을 사용하면 30 일 재입도를 계산해야합니다.

전류 출력 : enter image description here

계산 : 다음 admit_visit 날짜에 index_admission 방전 날짜 ,

1) DIFF 30 일 미만을 갖는 경우, 재 입원 = 1 및 색인 = 0

else readmission=0 and Index=1 should be update. 

매번 이것을 확인하려면 최신 index_admission discharge_date를 사용하여 확인해야합니다.

이 결과를 얻으려면 논리 값 아래에 쓰지 만 첫 번째 색인 승인을 사용하여 30 일 사후 퇴직 후 재 입력 = 0 및 색인 = 1을 업데이트하고 있습니다.

UPDATE Readmission 
SET Index_AMI = (CASE 
     WHEN DATEDIFF(DD, (SELECT 
      Sub.Max_Index_Dis 
     FROM (SELECT 
      Patient_ID, 
      MAX(Discharge_Date_Time) Max_Index_Dis 
     FROM Readmission 
     WHERE Index_AMI = 1 AND FPR.Patient_ID = Patient_ID 
     GROUP BY Patient_ID) Sub), FPR.Admit_Date_Time) <= 31 THEN 0 ELSE 1 
    END), 
    Is_AMI_Readmission = (CASE 
     WHEN DATEDIFF(DD, (SELECT 
      Sub.Max_Index_Dis 
     FROM (SELECT 
      Patient_ID, 
      MAX(Discharge_Date_Time) Max_Index_Dis 
     FROM Readmission 
     WHERE Index_AMI = 1 AND FPR.Patient_ID = Patient_ID 
     GROUP BY Patient_ID) Sub) 
     , FPR.Admit_Date_Time) <= 31 THEN 1 ELSE 0 
    END) 
FROM Readmission FPR 
WHERE fpr.index_ami IS NULL 

예상 결과 : enter image description here

이 문제를 해결하기 위해 도와주세요.

최고 감사합니다,

+1

필요한 "예상"결과 (비어 있음)는 "예상치 못한"입니다. 현재 출력과 필요한 출력을 게시하고 sqlfiddle을 만들면 전체 도움이됩니다! –

+1

올바른 정렬로 쿼리 만들기 ... – Jesuraja

+0

집합 기반 업데이트를 사용해야합니까? 커서를 사용하면 훨씬 쉽게 할 수 있습니다. – adrianm

답변

0

Nagendra는 도와 주려고에 대한 여러분 모두 감사합니다. 임시 테이블을 사용하여 문제를 해결할 수있는 방법이 있습니다. 이 접근법에 어떤 문제, 특히 성능이있는 경우 자유롭게 의견을 말하고 비평하십시오.

/*------------ To moving all Patient_Readmission data into temp table -------------*/ 
IF EXISTS (select * FROM tempdb.dbo.sysobjects o 
    WHERE o.xtype IN ('U') 
AND o.id = OBJECT_ID(N'tempdb..#Readmission') 
) 
Begin 
DROP TABLE #Readmission 
End 

IF NOT EXISTS (SELECT * FROM tempdb.dbo.sysobjects o 
    WHERE o.xtype IN ('U') 
AND o.id = OBJECT_ID(N'tempdb..#Readmission') 
) 
BEGIN 
select Patient_ID,ID,Encounter_Code 
,Admit_Date_Time,Discharge_Date_Time 
,Is_AMI_Readmission,Index_AMI 
into #Readmission 
from Patient_Readmission 
END 

GO 
/*----------- To get Max Index discharge_date for all patients where index=1----------*/ 
IF EXISTS (select * FROM tempdb.dbo.sysobjects o 
    WHERE o.xtype IN ('U') 
AND o.id = OBJECT_ID(N'tempdb..#Each_Pt_Max_Dsrg') 
) 
Begin 
DROP TABLE #Each_Pt_Max_Dsrg 
End 

IF NOT EXISTS (SELECT * FROM tempdb.dbo.sysobjects o 
    WHERE o.xtype IN ('U') 
AND o.id = OBJECT_ID(N'tempdb..#Each_Pt_Max_Dsrg') 
) 
BEGIN 
select Patient_ID,Index_AMI,Max(Discharge_Date_Time) Max_Index_Dis 
into #Each_Pt_Max_Dsrg 
from #Readmission where Index_AMI=1 group by Patient_ID,Index_AMI 
END 


Declare @var int 
Set @var=(select Min(Patient_ID) from #Each_Pt_Max_Dsrg) 
While @var is not null 
    Begin 
     Declare @Var_En int 
     declare @maxDisch datetime 
     Set @Var_En=(Select Min(ID) From #Readmission Where Index_AMI Is null and [email protected]) 
     While @Var_En is Not NULL 
     Begin 
      set @maxDisch = dateadd(dd,-1,(select max(Max_Index_Dis) from #Each_Pt_Max_Dsrg where Index_AMI=1 and [email protected])) 
      while (@maxDisch < (select max(Max_Index_Dis) from #Each_Pt_Max_Dsrg where Index_AMI=1 and [email protected])) 
       begin 
        Update #Readmission 
         set Index_AMI=(Case When Datediff(DD,(Select Max(Max_Index_Dis) From #Each_Pt_Max_Dsrg Where Index_AMI=1 And [email protected]),FPR.Admit_Date_Time) between 0 and 31 Then 0 Else 1 End) 
         ,Is_AMI_Readmission=(Case When Datediff(DD,(Select Max(Max_Index_Dis) From #Each_Pt_Max_Dsrg Where Index_AMI=1 And [email protected]),FPR.Admit_Date_Time) between 0 and 31 Then 1 Else 0 End) 
        From #Readmission FPR where [email protected] and [email protected]_En and Index_AMI is NULL 

        set @maxDisch = (select max(Max_Index_Dis) from #Each_Pt_Max_Dsrg where Index_AMI=1 and [email protected]) 

        delete from #Each_Pt_Max_Dsrg 

        insert into #Each_Pt_Max_Dsrg 
        select Patient_ID,Index_AMI,Max(Discharge_Date_Time) Max_Index_Dis 
        from #Readmission where Index_AMI=1 group by Patient_ID,Index_AMI 
       end 

     SET @Var_En = (SELECT Min(ID) FROM #Readmission WHERE ID> @Var_En) 
     End 

    SET @Var = (SELECT MIN(Patient_ID) FROM #Each_Pt_Max_Dsrg WHERE Patient_ID > @var) 
    End 
관련 문제