创建一个变量,逐步计算一个ID在一天中重复多少次



所以我有一个表,每天有不同的日期和不同的小时,并且客户端ID每天可以出现多次。

data Data1;
infile datalines delimiter=',';
input date :ddmmyy10. ID $ time :time8. $ ;
format date ddmmyy10.;  
format time time8.; 
datalines;
05/11/2020,1000,8:15:23
05/11/2020,1000,8:20:10
05/11/2020,1001,8:21:10
05/11/2020,1001,9:05:15
05/11/2020,1001,10:30:20
06/11/2020,1002,8:26:10
06/11/2020,1003,8:27:10
06/11/2020,1003,9:40:01
;

我想输出另一列,名为"Attempts"它看起来像这样:

data Data1;
infile datalines delimiter=',';
input date :ddmmyy10. ID $ time :time8. $ Attempt;
format date ddmmyy10.;  
format time time8.; 
datalines;
05/11/2020,1000,8:15:23,1
05/11/2020,1000,8:20:10,2
05/11/2020,1001,8:21:10,1
05/11/2020,1001,9:05:15,2
05/11/2020,1001,10:30:20,3
06/11/2020,1002,8:26:10,1
06/11/2020,1003,8:27:10,1
06/11/2020,1003,9:40:01,2
06/11/2020,1000,10:20:10,1
06/11/2020,1000,11:20:10,2
06/11/2020,1000,12:20:10,3
06/11/2020,1000,13:20:10,3
;

可以看到,客户1000在05/11出现了两次,在06/11出现了4次,客户1001在05/11出现了3次,客户1002在06/11出现了一次,客户1003在06/11出现了2次。

我也希望3是最大值,所以如果一个客户在一天内出现超过3次(如客户1000在06/11),值将是3。

我不介意使用sas语言或proc sql,所以如果有人有任何想法,请告诉我

只使用BY组处理和保留变量。您可以使用MIN()函数将计数器设置为3。

data Data1;
infile datalines dsd;
input date :ddmmyy. ID $ time :time. expect;
format date ddmmyy10. time time8.; 
datalines;
05/11/2020,1000,8:15:23,1
05/11/2020,1000,8:20:10,2
05/11/2020,1001,8:21:10,1
05/11/2020,1001,9:05:15,2
05/11/2020,1001,10:30:20,3
06/11/2020,1000,10:20:10,1
06/11/2020,1000,11:20:10,2
06/11/2020,1000,12:20:10,3
06/11/2020,1000,13:20:10,3
06/11/2020,1002,8:26:10,1
06/11/2020,1003,8:27:10,1
06/11/2020,1003,9:40:01,2
;
data want;
set data1;
by date id ;
retain attempt;
if first.id then attempt=1;
else attempt=min(3,attempt+1);
run;

注意:我重新排序了您的样本数据,以避免需要添加PROC SORT步骤。如果您的真实数据集是分组的,但没有排序,如在您的示例中,您可以在BY语句上添加NOTSORTED关键字,逻辑将工作。

或者,您仍然可以使用条件相关聚合查询来考虑proc sql:

data Data1;
infile datalines delimiter=',';
input date :ddmmyy10. ID $ time :time8. ;
format date ddmmyy10.;  
format time time8.; 
datalines;
05/11/2020,1000,8:15:23
05/11/2020,1000,8:20:10
05/11/2020,1001,8:21:10
05/11/2020,1001,9:05:15
05/11/2020,1001,10:30:20
06/11/2020,1002,8:26:10
06/11/2020,1003,8:27:10
06/11/2020,1003,9:40:01
06/11/2020,1000,10:20:10,1
06/11/2020,1000,11:20:10,2
06/11/2020,1000,12:20:10,3
06/11/2020,1000,13:20:10,3
;
proc sql;
CREATE TABLE output AS
SELECT d.date, d.ID, d.time
, (SELECT CASE 
WHEN COUNT(*) > 3 
THEN 3 
ELSE COUNT(*) 
END FROM Data1 sub
WHERE sub.ID = d.ID
AND sub.date = d.date
AND sub.time <= d.time
) AS attempts
FROM Data1 d; 
quit;   

相关内容

最新更新