第一次通信连续数月

时间:2017-08-22 09:28:50

标签: sql sas dataset

我想问你这个问题的帮助。

我有客户列表,对于每个客户,我列出了该客户与我们联系的月份。我需要知道特定客户与我们联系了多少个月。但是有一个问题,我需要知道他第一次接触后连续几个月的数量。

所以我有这样的表

+---------+-------+
| 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;

非常感谢

1 个答案:

答案 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.