Dengan hormat kepada semua orang dan di IMHO,
There is not much difference between While LOOP and Recursive CTE in terms of RBAR
Tidak ada banyak peningkatan kinerja saat menggunakan Recursive CTE
dan Window Partition function
semuanya.
Appid
harus int identity(1,1)
, atau harus semakin meningkat clustered index
.
Selain manfaat lainnya, ini juga memastikan bahwa semua deretan APPDate
pasien yang berurutan harus lebih besar.
Dengan cara ini Anda dapat dengan mudah bermain APPID
dalam kueri yang akan lebih efisien daripada menempatkan inequality
operator seperti>, <di APPDate. Menempatkan inequality
operator seperti>, <dalam APPID akan membantu Pengoptimal Sql.
Juga harus ada dua kolom tanggal dalam tabel seperti
APPDateTime datetime2(0) not null,
Appdate date not null
Karena ini adalah kolom paling penting di tabel paling penting, jadi tidak banyak pemain, konversi.
Jadi Non clustered index
bisa dibuat di Appdate
Create NonClustered index ix_PID_AppDate_App on APP (patientid,APPDate) include(other column which is not i predicate except APPID)
Tes skrip saya dengan data sampel lain dan biar tahu sampel data mana yang tidak berfungsi. Bahkan jika itu tidak berhasil maka saya yakin itu bisa diperbaiki dalam logika skrip saya sendiri.
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