我想问你这个问题的帮助。
我有客户列表,对于每个客户,我列出了该客户与我们联系的月份。我需要知道特定客户与我们联系了多少个月。但是有一个问题,我需要知道他第一次接触后连续几个月的数量。
所以我有这样的表
+---------+-------+
| cust id | month |
+---------+-------+
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 8 |
| 1 | 9 |
| 1 | 10 |
| 1 | 11 |
| 1 | 12 |
+---------+-------+
我需要添加这样的列
+---------+-------+-------+
| cust id | month | flg |
+---------+-------+-------+
| 1 | 2 | 1 |
| 1 | 3 | 1 |
| 1 | 4 | 1 |
| 1 | 5 | 1 |
| 1 | 8 | 0 |
| 1 | 9 | 0 |
| 1 | 10 | 0 |
| 1 | 11 | 0 |
| 1 | 12 | 0 |
+---------+-------+-------+
所以最后我只在列flg中将所有1加起来。结果将是消费者1连续第一次接触我们4次联系我们。
我尝试过使用类似的东西,但它不起作用:(我不知道该怎么办1只会连续第一行。
data test1;
set customer_base;
retain month_ret;
output;
by cust_id month;
month_ret = month;
run;
Data test2;
Set test1;
By cust_id;
If first.cust_id then i=1;
if month= month_ret+1 then i=1;
if month<>month_ret+1 then output;
Run;
非常感谢
答案 0 :(得分:1)
您的代码中存在两个问题。
1)if month= month_ret+1 then i=1;
每次这都是真的,你将标志设置为1.但是,你应该这样做,而这对于当前客户来说从来都不是假的。
2)if month<>month_ret+1 then output;
正如您在SAS日志中看到的那样,<>
运算符被错误地解释为MAX
。因此,这种情况永远不会成立。此外,由于此处有明确的output
,如果要将此条件正确写为if month ne month_ret+1 then output;
,则结果表将仅包含此条件为真的记录。
您想要实现的目标可以一步完成,如下所示:
data have;
infile datalines;
input cust_id month;
datalines;
1 2
1 3
1 4
1 5
1 8
1 9
1 10
1 11
1 12
;
run;
data want (drop=p_month);
set have;
by cust_id;
retain flg p_month;
if first.cust_id then flg=1;
else if month ne p_month+1 then flg=0;
p_month=month;
run;
对于每个第一个客户,您将标志设置为1.然后,当月份不等于前一个加号时,将标志设置为0.