Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获得所需的输出数据以确定治疗模式?_Sql_Sas - Fatal编程技术网

Sql 如何获得所需的输出数据以确定治疗模式?

Sql 如何获得所需的输出数据以确定治疗模式?,sql,sas,Sql,Sas,我在sas中创建所需的输出数据时遇到问题 我必须确定前21天使用的药物,这将创建初始治疗线。但以下规则适用于最终确定治疗线 起始日期为首次使用任何药物,无论是否有核心药物 结束日期为上次使用任何核心药物的最后结束日期 如果在初始治疗线结束日期后的60天内发现初始治疗线的任何核心药物,则初始治疗线结束日期将更新为该确定核心药物的结束日期。再次,我必须检查60天的间隔等等 如果在初始批次结束日期前确定了新的核心药物(初始治疗线的核心药物除外),则第一批将在新核心药物开始日期前一天结束。第二条治疗线将

我在sas中创建所需的输出数据时遇到问题

我必须确定前21天使用的药物,这将创建初始治疗线。但以下规则适用于最终确定治疗线

起始日期为首次使用任何药物,无论是否有核心药物

结束日期为上次使用任何核心药物的最后结束日期

如果在初始治疗线结束日期后的60天内发现初始治疗线的任何核心药物,则初始治疗线结束日期将更新为该确定核心药物的结束日期。再次,我必须检查60天的间隔等等

如果在初始批次结束日期前确定了新的核心药物(初始治疗线的核心药物除外),则第一批将在新核心药物开始日期前一天结束。第二条治疗线将从新核心药物开始日期开始

如果在初始治疗线结束日期后的60天内,初始治疗批次中没有核心药物,则将开始第二线治疗,并应用上述相同规则寻找第三批或后续批次。 如果在第二线治疗开始后的几天内,核心药物C1继续使用,并且在第二线治疗开始后的任何时间再次发现,则第二线治疗将包含第二线治疗的药物以及C1。结束日期将是任何核心药物最近一次使用的结束日期毒品

我有数据

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数据库?你能发布创建脚本吗?我已经添加了我尝试过的代码。我认为这对于一个如此简单的问题来说太多了。如果你能一次只回答一个问题,你可能会得到更好的回答。我知道这是一个很大的过程,但对于那些不每天处理此类数据的人来说,这将很难理解,我过去经常这样做;)