每周跟踪客户保留情况

时间:2013-09-25 12:42:17

标签: sql sas proc-sql

我有一个特定客户的开始和结束周,我需要在他们订阅的几周内制作面板数据。我已经将数据操作成一个简单的形式进行转换,但是当我转置时,我没有得到开始和结束之间的几周填写。希望一个例子可以解释我的请求。周从0开始到61结束,因此为了简单起见,强迫61以上的任何一周为61。如果他们仍然订阅则填充1,否则填充空白。

ID  Start_week   End_week

1       6           61
2       0           46
3       45          61

我想要什么

ID   week0  week1  ... week6 ... week45 week46  week47 ... week61
1      .      .    ...   1   ...    1      1       1   ...    1 
2      1      1    ...   1   ...    1      1       0   ...    0
3      0      0    ...   0   ...    1      1       1   ...    1 

3 个答案:

答案 0 :(得分:2)

使用数组创建变量。一个问题是SAS阵列是1索引的。

data input;
input ID  Start_week   End_week;
datalines;
1       6           61
2       0           46
3       45          61
;

data output;
array week[62] week0-week61;
set input;
do i=1 to 62;
    if i > start_week and i<= (end_week+1) then
        week[i] = 1;
    else
        week[i] = 0;
end;
drop i;
run;

答案 1 :(得分:2)

我认为有两种方法可以做到。 我会采用数组方法,因为它可能是最快的(单个数据步骤)并且不是那么复杂:

data RESULT (drop=start_week end_week);
    set YOUR_DATA;
    array week_array{62} week0-week61;
    do week=0 to 61;
        if week between start_week and end_week then week_array[week+1]=1;
        else week_array[week+1]=0;
    end;
run;

或者,您可以通过每个id ::

每周创建一条记录来准备转置表
data BEFORE_TRANSPOSE (drop=start_week end_week);
    set YOUR_DATA;
    do week=0 to 61;
        if week between start_week and end_week then subscribed=1;
        else subscribed=0;
        output;
    end;
run;

答案 2 :(得分:0)

我没有合法的语法,但是你的指南。

首先用CTE制作一个表,或者用数字0到61作为行。然后将此表与订阅表连接。像

这样的东西
FROM sub
INNER JOIN CTE 
ON CTE.week BETWEEN sub.Start_week AND sub.End_week

现在,客户订阅的每周都会有一行。转换那个并且你将在几周之内也填写。