Con il dovuto rispetto per tutti e in IMHO,
There is not much difference between While LOOP and Recursive CTE in terms of RBAR
Non c'è molto guadagno in termini di prestazioni durante l'utilizzo Recursive CTE
e Window Partition function
tutto in uno.
Appid
dovrebbe essere int identity(1,1)
, o dovrebbe essere in costante aumento clustered index
.
Oltre ad altri benefici, assicura anche che tutte le file successive APPDate
di quel paziente debbano essere maggiori.
In questo modo puoi facilmente giocare con la APPID
tua query che sarà più efficiente di mettere inequality
operatore come>, <in APPDate. Mettere l' inequality
operatore come>, <in APPID aiuterà Sql Optimizer.
Inoltre ci dovrebbero essere due colonne di date nella tabella come
APPDateTime datetime2(0) not null,
Appdate date not null
Poiché queste sono le colonne più importanti nella tabella più importante, quindi non molto cast, converti.
Quindi Non clustered index
può essere creato su Appdate
Create NonClustered index ix_PID_AppDate_App on APP (patientid,APPDate) include(other column which is not i predicate except APPID)
Prova il mio script con altri dati di esempio e fammi sapere per quali dati di esempio non funziona. Anche se non funziona, sono sicuro che può essere corretto nella mia logica di script stessa.
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