Với sự tôn trọng đối với mọi người và trong IMHO,
There is not much difference between While LOOP and Recursive CTE in terms of RBAR
Không có nhiều hiệu suất đạt được khi sử dụng Recursive CTE
và Window Partition function
tất cả trong một.
Appid
nên được int identity(1,1)
, hoặc nó sẽ ngày càng tăng clustered index
.
Ngoài lợi ích khác, nó cũng đảm bảo rằng tất cả các hàng liên tiếp APPDate
của bệnh nhân đó phải lớn hơn.
Bằng cách này, bạn có thể dễ dàng chơi với APPID
truy vấn của mình sẽ hiệu quả hơn so với việc đặt inequality
toán tử như>, <trong APPDate. Đưa inequality
toán tử như>, <trong APPID sẽ hỗ trợ Trình tối ưu hóa Sql.
Ngoài ra nên có hai cột ngày trong bảng như
APPDateTime datetime2(0) not null,
Appdate date not null
Vì đây là những cột quan trọng nhất trong bảng quan trọng nhất, nên không có nhiều cast, convert.
Vì vậy, Non clustered index
có thể được tạo ra trên Appdate
Create NonClustered index ix_PID_AppDate_App on APP (patientid,APPDate) include(other column which is not i predicate except APPID)
Kiểm tra tập lệnh của tôi với dữ liệu mẫu khác và tôi biết dữ liệu mẫu nào không hoạt động. Ngay cả khi nó không hoạt động thì tôi chắc chắn nó có thể được sửa trong chính logic script của tôi.
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