ด้วยความเคารพต่อทุกคนและใน 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
ของผู้ป่วยนั้นจะต้องมากขึ้น
วิธีนี้คุณสามารถเล่นAPPID
ในแบบสอบถามได้อย่างง่ายดายซึ่งจะมีประสิทธิภาพมากกว่าการใส่inequality
โอเปอเรเตอร์เช่น>, <ใน APPDate การวาง inequality
โอเปอเรเตอร์เช่น>, <ใน APPID จะช่วยเพิ่มประสิทธิภาพ Sql
นอกจากนี้ควรมีคอลัมน์วันที่สองคอลัมน์ในตารางดังนี้
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)
ทดสอบสคริปต์ของฉันกับข้อมูลตัวอย่างอื่นและรู้ว่าตัวอย่างข้อมูลใดที่ไม่ทำงาน แม้ว่ามันจะไม่ได้ผลก็ตามฉันก็มั่นใจว่ามันสามารถแก้ไขได้ในสคริปต์สคริปต์ของฉันเอง
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