在一段时间内选择每一个第一次出现的列值

时间:2017-08-20 09:57:29

标签: sas

我的数据如下所示。

MSISDN  DATE    NET_TYPE
11111   01/01/2017  1
11111   02/01/2017  1
11111   03/01/2017  1
11111   04/01/2017  2
11111   05/01/2017  2
11111   06/01/2017  2
11111   07/01/2017  2
11111   08/01/2017  2
11111   09/01/2017  1
11111   10/01/2017  1
11111   11/01/2017  1
11111   12/01/2017  1
11111   13/01/2017  1
11111   14/01/2017  2
11111   15/01/2017  2
11111   16/01/2017  2

我正在寻找一个解决方案,我创建一个新变量,它有助于在一段时间内选择NET_TYPE的每一个第一次和最后一次出现(日期值不固定,NET_TYPE可以是1或2天或数月或数年)。解决方案我看起来如下。

MSISDN  DATE    NET_TYPE    INDICATOR
11111   01/01/2017  1   1
11111   02/01/2017  1   0
11111   03/01/2017  1   1
11111   04/01/2017  2   1
11111   05/01/2017  2   0
11111   06/01/2017  2   0
11111   07/01/2017  2   0
11111   08/01/2017  2   1
11111   09/01/2017  1   1
11111   10/01/2017  1   0
11111   11/01/2017  1   0
11111   12/01/2017  1   0
11111   13/01/2017  1   1
11111   14/01/2017  2   1
11111   15/01/2017  2   0
11111   16/01/2017  2   1

如果您能提供解决方案,那么SAS非常有帮助。

我已经尝试过的代码在SAS中不起作用:

SELECT *, 
       CASE 
         WHEN net_type <> COALESCE(Lag(net_type, 1) 
                                     OVER ( 
                                       partition BY sub_no 
                                       ORDER BY dt), 99) THEN dt 
       END AS starting, 
       CASE 
         WHEN net_type <> COALESCE(Lag(net_type, 1) 
                                     OVER ( 
                                       partition BY sub_no 
                                       ORDER BY dt DESC), 99) THEN dt 
       END AS ending 
FROM   table 
ORDER  BY dt 

1 个答案:

答案 0 :(得分:1)

在SAS中,如果您对数据逐步处理有足够的了解,那么这很简单,如果您不了解,则很难做到。正如您所发现的那样,proc sql不支持您正在使用的partition by语法。这是一个数据步骤解决方案:

data have;
input MSISDN & DATE & ddmmyy10. NET_TYPE;
format DATE ddmmyy10.;
cards;
11111   01/01/2017  1
11111   02/01/2017  1
11111   03/01/2017  1
11111   04/01/2017  2
11111   05/01/2017  2
11111   06/01/2017  2
11111   07/01/2017  2
11111   08/01/2017  2
11111   09/01/2017  1
11111   10/01/2017  1
11111   11/01/2017  1
11111   12/01/2017  1
11111   13/01/2017  1
11111   14/01/2017  2
11111   15/01/2017  2
11111   16/01/2017  2
;
run;

data want;
  set have;
  by notsorted MSISDN NET_TYPE;
  INDICATOR = first.NET_TYPE or LAST.NET_TYPE;
  put (_all_) (=);
run;

如果您在数据步骤中有by语句,则会在first.x语句中为每个变量创建临时last.xby变量,方法是自动查看输入数据集中的下一行。

通常by语句要求对数据集进行排序,但notsorted选项会覆盖此选项,并允许您标识变量从一个值更改为另一个值的任何行,而不管顺序如何。