根据多种条件在SAS中添加计数器

时间:2016-12-15 11:15:13

标签: sorting sas counter multiple-conditions

我想就涉及基于多种条件的计数器的SAS问题寻求帮助。

我有一个包含销售员工访客的数据集。但是,数据集按访问期间执行的任务进行组织,因此它可以包含同一访问的多个条目。访问本身可以跨越几天。目前,数据集按通用ID排序。

请在此处找到数据集的屏幕截图:Data extract

我需要引入一个明确标识属于同一访问的条目的计数器。该计数器应基于以下条件

  • 每个新员工 - 客户组合的新访问计数器。
  • 同一员工 - 客户组合的新访问计数器仅在以下日期条件不符合时:1)条目来自相邻日期,2)一个条目不是"嵌入"在正在进行的访问中

StartDate和EndDate在这个意义上定义了一个时间范围,这对于各个条目的分类很重要。

这是数据集(包括可能有助于澄清上述条件的每个条目的预期解决方案和注释):

ID StartDate EndDate EmployeeNo CustomerNo目标解决方案评论 1 06.01.2009 07.01.2009 1 5 1相邻日子 2 07.01.2009 08.01.2009 1 5 1相邻日子 3 08.01.2009 08.01.2009 1 5 1相邻日子 4 05.01.2009 06.01.2009 2 7 2相邻日子 5 06.01.2009 07.01.2009 2 7 2相邻日子 6 05.01.2009 09.01.2009 3 1 3嵌入式入口 7 08.01.2009 08.01.2009 3 1 3嵌入式入口 8 09.01.2009 13.01.2009 4 2 4相邻的日子 9 13.01.2009 13.01.2009 4 2 4相邻日子 10 05.01.2009 13.01.2009 5 3 5 - 11 19.01.2009 23.01.2009 6 3 6另外,由于员工不同 12 05.01.2009 16.01.2009 6 3 7同样的员工和客户,但没有相邻的日子 13 02.02.2009 03.02.2009 7 8 8相邻的日子 14 03.02.2009 04.02.2009 7 8 8相邻的日子 15 22.09.2010 22.09.2010 8 4 9 - 16 22.09.2010 22.09.2010 8 4 9 - 17 21.09.2010 21.09.2010 9 1 10相邻日子 18 21.09.2010 24.09.2010 9 1 10相邻日子 19 12.01.2009 22.01.2009 10 6 11相邻日子 20 23.01.2009 23.01.2009 10 6 11相邻日子 21 12.01.2009 19.01.2009 10 6 11嵌入式入口 22 26.01.2009 26.01.2009 2 9 12当天 23 26.01.2009 26.01.2009 2 9 12当天 24 26.01.2009 26.01.2009 2 9 12当天 25 07.05.2012 07.05.2012 1 2 13 - 26 09.05.2012 09.05.2012 1 2 14另外,因为没有相邻的日子 27 09.07.2013 09.07.2013 3 10 15相邻日子 28 10.07.2013 11.07.2013 3 10 15相邻日子 29 08.09.2014 08.09.2014 4 1 16相邻日子 30 09.09.2014 10.09.2014 4 1 16相邻日子 31 08.09.2014 08.09.2014 4 1 16相邻日子 32 15.09.2014 15.09.2014 4 1 17另外,因为没有相邻的日子 33 05.09.2014 05.09.2014 5 7 18相邻日子 34 04.09.2014 05.09.2014 5 7 18相邻日子 35 01.06.2015 01.06.2015 7 4 19独立柜台,因为没有相邻的日子 36 03.06.2015 03.06.2015 7 4 20独立柜台,因为没有相邻的日子 37 11.06.2015 12.06.2015 7 4 21相邻日子 38 09.06.2015 10.06.2015 7 4 21相邻日子 39 09.06.2015 09.06.2015 10 4 22另外,由于员工不同但相邻的日子 40 11.06.2015 12.06.2015 10 4 22另外,由于员工不同但相邻的日子 41 10.06.2015 10.06.2015 10 4 22另外,由于员工不同但相邻的日子

在开始之前,我已按EmployeeNo,CustomerNo,StartDate和EndDate对数据集进行了排序。然后我尝试使用几个SET / BY和First.Variable组合,这些组合允许我正确地实现员工 - 客户条件。但是,我对日期条件很困难。

这是我的代码的当前状态。

 Data Count_Visits;
   Set Data;
   BY EmployeeNo CustomerNo;

   Retain Counter;

   IF First.EmployeeNo THEN Counter +1;
   ELSE IF First.CustomerNo THEN Counter +1;

   Keep ID StartDate EndDate EmployeeNo 
        CustomerNo Counter;
 Run;

非常感谢任何建议。

此致 马贝

1 个答案:

答案 0 :(得分:1)

我相信我自己想出了一个解决方案。可能它有点蛮力,但它似乎适用于超过300k的条目。

Data Count_Visits;
  Set Data;
  BY EmployeeNo CustomerNo StartDate Enddate;
    lag_Start = lag(StartDate);
    lag_End = lag(EndDate);
    lag_End1 = lag(EndDate)+1;

    lag2_End1 = lag2(EndDate)+1;
    lag2_Techn = lag2(TechnNo);
    lag2_Cust = lag2(CustNo);

    lag3_End1 = lag3(EndDate)+1;
    lag3_Techn = lag3(TechnNo);
    lag3_Cust = lag3(CustNo);

    lag4_End1 = lag4(EndDate)+1;
    lag4_Techn = lag4(TechnNo);
    lag4_Cust = lag4(CustNo);

    lag5_End1 = lag5(EndDate)+1;
    lag5_Techn = lag5(TechnNo);
    lag5_Cust = lag5(CustNo);

  Retain Counter;

  IF First.EmployeeNo THEN Counter +1;
    ELSE IF First.CustomerNo THEN Counter +1;
    ELSE IF StartDate GE lag_Start AND Startdate LT lag_End THEN Counter = Counter;
    ELSE IF StartDate LE lag_End1 THEN Counter = Counter;
    ELSE IF TechnNo = lag2_Techn AND CustNo = lag2_Cust AND StartDate LE lag2_End1 THEN Counter = Counter;
    ELSE IF TechnNo = lag3_Techn AND CustNo = lag3_Cust AND StartDate LE lag3_End1 THEN Counter = Counter;
    ELSE IF TechnNo = lag4_Techn AND CustNo = lag4_Cust AND StartDate LE lag4_End1 THEN Counter = Counter;
    ELSE IF TechnNo = lag5_Techn AND CustNo = lag5_Cust AND StartDate LE lag5_End1 THEN Counter = Counter;
  ELSE Counter +1;

运行;