Sas 在一段时间内拾取列值的每一次首次出现

Sas 在一段时间内拾取列值的每一次首次出现,sas,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

我的数据如下所示

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_类型的第一次和最后一次出现(日期值不是固定的,NET_类型可以是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)
超过(
按子单元编号划分
按dt排序),99)然后按dt排序
以开始结束,
案例
当网络类型合并时(滞后(网络类型,1)
超过(
按子单元编号划分
按dt DESC)排序,99)然后按dt排序
结束
从桌子上
按dt订购

在SAS中,如果您对数据逐组处理有足够的了解,这是非常简单的,如果您不了解,则很难做到。正如您所发现的,procsql不支持您正在使用的
分区方式
语法。以下是一个数据步骤解决方案:

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
语句时,它会通过自动向前查看输入数据集中的下一行,为
by
语句中的每个变量创建临时
first.x
last.x
变量


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

StackOverflow旨在帮助编码人员处理其代码。我们不会根据您的规范编写解决方案。如果您有迄今为止尝试过的代码,我们可能会提供帮助。我不需要完整的解决方案,一个提示就可以解决。我先试了一下。最后。使用proc sort的变量,但不起作用。我试着这样选择*,min(dt)over(按网络类型划分),max(dt)over(按网络类型划分)from sandbox.santhoshselect*,当网络类型合并时的情况(lag(netu类型,1)over(按子类型划分,不按dt排序),99)然后dt end作为开始,当网络类型合并时的情况(lag(netu类型,1)over(按子类型划分,不按dt desc排序),99)然后,dt结束为从表顺序结束dt我已经尝试过了,但它只在db中工作,在sasI中不工作。我认为SAS不支持SQL语句中的分区和窗口。我认为是这样的,或者您的编辑器在cards语句中用空格替换了制表符,并且数据没有被正确读取。如果替换多个空格,效果很好。@david25272-已修复