모든 사람과 IMHO와 관련하여
There is not much difference between While LOOP and Recursive CTE in terms of RBAR
사용할 때 많은 성능 향상이 없습니다 Recursive CTE
및 Window Partition function
모든 일인치
Appid
해야 할 int identity(1,1)
, 또는 계속 증가해야한다 clustered index
.
다른 이점과는 별도로 APPDate
해당 환자의 모든 연속 행 이 더 커야합니다.
이렇게하면 APPDate에>, <와 같은 연산자를 APPID
배치하는 것보다 효율적인 쿼리에서 쉽게 재생할 수 있습니다 inequality
. inequality
APPID에>, <와 같은 연산자를 넣으면 Sql Optimizer에 도움이됩니다.
또한 테이블에 두 개의 날짜 열이 있어야합니다.
APPDateTime datetime2(0) not null,
Appdate date not null
이것들은 가장 중요한 테이블에서 가장 중요한 열이므로 변환하지 마십시오.
그래서 Non clustered index
Appdate 만들 수 있습니다
Create NonClustered index ix_PID_AppDate_App on APP (patientid,APPDate) include(other column which is not i predicate except APPID)
다른 샘플 데이터로 스크립트를 테스트하고 lemme은 작동하지 않는 샘플 데이터를 알고 있습니다. 작동하지 않더라도 스크립트 논리 자체에서 수정할 수 있다고 확신합니다.
CREATE TABLE #Appt1 (ApptID INT, PatientID INT, ApptDate DATE)
INSERT INTO #Appt1
SELECT 1,101,'2020-01-05' UNION ALL
SELECT 2,505,'2020-01-06' UNION ALL
SELECT 3,505,'2020-01-10' UNION ALL
SELECT 4,505,'2020-01-20' UNION ALL
SELECT 5,101,'2020-01-25' UNION ALL
SELECT 6,101,'2020-02-12' UNION ALL
SELECT 7,101,'2020-02-20' UNION ALL
SELECT 8,101,'2020-03-30' UNION ALL
SELECT 9,303,'2020-01-28' UNION ALL
SELECT 10,303,'2020-02-02'
;With CTE as
(
select a1.* ,a2.ApptDate as NewApptDate
from #Appt1 a1
outer apply(select top 1 a2.ApptID ,a2.ApptDate
from #Appt1 A2
where a1.PatientID=a2.PatientID and a1.ApptID>a2.ApptID
and DATEDIFF(day,a2.ApptDate, a1.ApptDate)>30
order by a2.ApptID desc )A2
)
,CTE1 as
(
select a1.*, a2.ApptDate as FollowApptDate
from CTE A1
outer apply(select top 1 a2.ApptID ,a2.ApptDate
from #Appt1 A2
where a1.PatientID=a2.PatientID and a1.ApptID>a2.ApptID
and DATEDIFF(day,a2.ApptDate, a1.ApptDate)<=30
order by a2.ApptID desc )A2
)
select *
,case when FollowApptDate is null then 'New'
when NewApptDate is not null and FollowApptDate is not null
and DATEDIFF(day,NewApptDate, FollowApptDate)<=30 then 'New'
else 'Followup' end
as Category
from cte1 a1
order by a1.PatientID
drop table #Appt1