根据多种条件在SAS中添加计数器
Adding a counter in SAS based on multiple conditions
我想就涉及基于多个条件的计数器的 SAS 问题寻求帮助。
我有一个包含销售人员的客户访问的数据集。但是,数据集是按访问期间执行的任务组织的,因此它可以包含同一访问的多个条目。访问本身可以跨越几天。目前,数据集按通用 ID 排序。
另请在此处找到数据集的屏幕截图:Data extract
我需要引入一个计数器来清楚地识别属于同一访问的条目。计数器应基于以下条件:
- 每个新员工-客户组合的新访问柜台。
- 仅当以下日期条件不成立时,同一员工-客户组合的新访问计数器:1) 条目来自相邻的日期,并且 2) 一个条目不在条目中 "embedded"正在进行的访问
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;
非常感谢任何建议。
此致,
梅贝
我相信我自己找到了解决办法。可能有点蛮力,但它似乎适用于超过 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;
运行;
我想就涉及基于多个条件的计数器的 SAS 问题寻求帮助。
我有一个包含销售人员的客户访问的数据集。但是,数据集是按访问期间执行的任务组织的,因此它可以包含同一访问的多个条目。访问本身可以跨越几天。目前,数据集按通用 ID 排序。
另请在此处找到数据集的屏幕截图:Data extract
我需要引入一个计数器来清楚地识别属于同一访问的条目。计数器应基于以下条件:
- 每个新员工-客户组合的新访问柜台。
- 仅当以下日期条件不成立时,同一员工-客户组合的新访问计数器:1) 条目来自相邻的日期,并且 2) 一个条目不在条目中 "embedded"正在进行的访问
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;
非常感谢任何建议。
此致, 梅贝
我相信我自己找到了解决办法。可能有点蛮力,但它似乎适用于超过 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;
运行;