2016-12-15 74 views
0

我想针对涉及基于多个条件的计数器的SAS问题寻求帮助。根据多个条件在SAS中添加计数器

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

请还发现这里的数据集的截图:Data extract

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

为每一位新员工的客户组合
  • 新的访问计数器。
  • 只有当日期的以下条件不成立时,才允许同一员工 - 客户组合的新访问计数器:1)条目来自相邻的日子,并且2)一个条目没有“嵌入”正在进行的访问的条目

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

这是数据集(包括预期的溶液和评论为每个条目,可能有助于阐明上述条件):

ID的StartDate结束日期为employeeno CustomerNo拟解决的评论 1 2009年1月6日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相邻日期s 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 2015年6月6日2015年6月12日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另外,由于不同的员工bu t相邻日子

开始之前我已经按照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; 

任何意见是非常感谢。

问候, 马贝

+0

请发布您到目前为止尝试过的代码。将您的示例输入和输出数据作为文本发布到问题中,而不是图像。 – user667489

+0

将数据包含为文本,而不是图像。如果有人想尝试他们测试的解决方案,他们需要手动输入数据。 – Reeza

+0

感谢您的建议,只是编辑我的帖子。 – mabe

回答

1

我相信,我想出了一个解决方案自己。可能它有点暴躁,但它似乎适用于超过30万条条目。

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; 

Run;