Sql 如何获得所需的输出数据以确定治疗模式?
我在sas中创建所需的输出数据时遇到问题 我必须确定前21天使用的药物,这将创建初始治疗线。但以下规则适用于最终确定治疗线 起始日期为首次使用任何药物,无论是否有核心药物 结束日期为上次使用任何核心药物的最后结束日期 如果在初始治疗线结束日期后的60天内发现初始治疗线的任何核心药物,则初始治疗线结束日期将更新为该确定核心药物的结束日期。再次,我必须检查60天的间隔等等 如果在初始批次结束日期前确定了新的核心药物(初始治疗线的核心药物除外),则第一批将在新核心药物开始日期前一天结束。第二条治疗线将从新核心药物开始日期开始 如果在初始治疗线结束日期后的60天内,初始治疗批次中没有核心药物,则将开始第二线治疗,并应用上述相同规则寻找第三批或后续批次。 如果在第二线治疗开始后的几天内,核心药物C1继续使用,并且在第二线治疗开始后的任何时间再次发现,则第二线治疗将包含第二线治疗的药物以及C1。结束日期将是任何核心药物最近一次使用的结束日期毒品 我有数据Sql 如何获得所需的输出数据以确定治疗模式?,sql,sas,Sql,Sas,我在sas中创建所需的输出数据时遇到问题 我必须确定前21天使用的药物,这将创建初始治疗线。但以下规则适用于最终确定治疗线 起始日期为首次使用任何药物,无论是否有核心药物 结束日期为上次使用任何核心药物的最后结束日期 如果在初始治疗线结束日期后的60天内发现初始治疗线的任何核心药物,则初始治疗线结束日期将更新为该确定核心药物的结束日期。再次,我必须检查60天的间隔等等 如果在初始批次结束日期前确定了新的核心药物(初始治疗线的核心药物除外),则第一批将在新核心药物开始日期前一天结束。第二条治疗线将
patient_id drug_name drug_type start end
A11 N1 Non_core 23-Apr-14 21-May-14
A11 C1 Core 27-Apr-14 25-May-14
A11 C1 Core 3-May-14 31-May-14
A11 N1 Non_core 10-May-14 7-Jun-14
A11 C2 Core 11-May-14 8-Jun-14
A11 N2 Non_core 12-May-14 9-Jun-14
A11 C1 Core 10-Jul-14 7-Aug-14
A11 C1 Core 15-Jul-14 12-Aug-14
A11 C3 Core 29-Jul-14 26-Aug-14
A11 N4 Non_core 8-Sep-14 6-Oct-14
A11 N2 Non_core 9-Sep-14 7-Oct-14
A11 C1 Core 12-Sep-14 10-Oct-14
A11 C1 Core 15-Sep-14 13-Oct-14
A11 C1 Core 27-Sep-14 25-Oct-14
A11 C3 Core 1-Jan-15 29-Jan-15
A11 C1 Core 3-Jan-15 31-Jan-15
A11 C1 Core 5-Jan-15 2-Feb-15
A11 C1 Core 10-Jan-15 7-Feb-15
A11 N1 Non_core 15-Jan-15 12-Feb-15
A11 N2 Non_core 18-Jan-15 15-Feb-15
我想要的数据
patient_id drug start end lot
A11 C1+N1+C2+N2 23-Apr-14 28-Jul-14 1
A11 C3+C1+N4+N2 29-Jul-14 25-Oct-14 2
A11 C3+C1+N1+N2 1-Jan-15 15-Feb-15 3
这里的地段代表治疗线
在本数据中,最初21天内发现的药物为N1、c1、c1、N1、c2、n2,批次1的初始开始日期为2014年4月23日,初始结束日期为任何核心药物的最新使用日期,即2014年6月8日
接下来,我需要检查初始批次是否有任何核心药物在初始批次结束后60天内可用。标段1的c1在60天内到达。因此,新的结束日期将更新为2014年8月7日。我再次需要寻找60天标准。我再次发现c1在60天内可用。因此,新的结束日期将为2014年12月8日。但根据上述规则,在初始治疗线结束之前有一种新的核心药物(初始批次的核心药物除外)。因此,第一条治疗线将在新确定的核心药物开始日期前一天结束。那么第一批的结束日期是2014年7月28日
第二条治疗线从2014年7月29日开始。同样的上述规则也适用于确定终止日期。21天内发现的药物为C3、C1、N4、N2、C1。初始终止日期为2014年10月13日。存在重叠药物(C1)由于C1的最新使用日期为2014年8月7日,即第二批开始后,且在第二批开始后的任何时间再次发现,因此第二批的结束日期为2014年10月25日
由于在60天内未发现任何药物,因此第二批结束时,第三批将于2015年1月1日开始。将适用与上述相同的规则
我已经尝试了下面的代码,但它没有给出所需的输出。它给出了下面的输出
患者id开始日期结束日期药品批次
A11 2014年4月27日2014年5月11日C1+N1+C2 1
A11 2014年7月10日8月14日C1+C3 2
A11 2014年9月12日26-9月14日C1 3
A111-Jan-15 17-Jan-15 C3+C1+C1 4
data want (keep=patient_id drug start_date end_date lot);
set have;
by patient_id;
retain start_date end_date drug end60;
format start_date end_date date9.;
set have ( firstobs = 2 keep = start drug_type drug_name
rename = (start = next_start drug_type=next_type drug_name=next_drug) )
have ( obs = 1 drop = _all_ );
next_start = ifn(last.patient_id, (.), next_start );
if first.patient_id or counter eq 0 then do;
start_date=start;
end_date=end;
if drug_type eq 'Core' then do;
counter=1;
drug=drug_name;
end60=end+60;
end;
else do;
drug='';
counter=0;
end;
end;
else if start le Start_Date+21 then do;
if counter=0 then do;
if drug_type eq 'Core' then do;
drug=drug_name;
counter=1;
end60=end;
end;
end;
else do;
if not findw(drug,drug_name) then drug=catx('+',drug,drug_name);
if drug_type eq 'Core' then do;
counter+1;
end_date=end;
end;
end;
end;
else if Start_Date le end60 and findw(drug,drug_name) and drug_type eq 'Core' then do;
end60=end+60;
end;
if counter gt 0 and
(next_start gt End60 or
(counter gt 0 and
not findw(drug,next_drug) and
next_type eq 'Core' and
next_start gt start_date+21)) or
last.patient_id then do;
end_date=start-1;
lot+1;
output;
drug='';
core='';
counter=0;
end;
run;
任何线索都会很有帮助。提前谢谢。这是很有道理的,老实说,我并没有全部读过。我建议您发布您尝试过的代码,以及它给出的输出,然后指出输出中的失望/惊喜。理解代码可能比理解完整的逻辑更容易。特别是如果您的代码接近您想要的工作方式。哪个sql数据库?你能发布创建脚本吗?我已经添加了我尝试过的代码。我认为这对于一个如此简单的问题来说太多了。如果你能一次只回答一个问题,你可能会得到更好的回答。我知道这是一个很大的过程,但对于那些不每天处理此类数据的人来说,这将很难理解,我过去经常这样做;)