2017-08-20 32 views
0

我有如下所示的数据。在一段时间内挑选列值的每一次出现

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

StackOverflow旨在帮助编码人员使用他们的代码。我们不根据您的规格书写解决方案。如果你有迄今为止尝试过的代码,我们可能会提供帮助。 – Assafs

+0

我不需要完整的解决方案,提示将很好解决。我第一次尝试。最后。使用proc分类变量,但没有解决。我想这样select *,min(dt)over(net_type分区),max(dt)over(分区by net_type)from sandbox.santhosh –

+0

select *, case net_type <> coalesce(lag(net_type,1 )OVER(通过sub_no ORDER BY dt划分),99)然后dt结束作为开始, 当net_type <> coalesce(lag(net_type,1)OVER(partition by by sub_no ORDER BY dt desc)通过DT 结束 从表顺序 我都试过,但它只能在分贝,但不是在SAS –

回答

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声明,它通过在下一行的输入数据集自动放眼望去会在您by语句给每个变量临时first.xlast.x变量。

通常,by声明要求对数据集进行排序,但notsorted选项将覆盖此选项,并允许您识别变量从一个值变为另一个值的任何行,而与排序无关。

+0

我想SO或你的编辑器已经用卡片语句中的空格取代了标签,并且数据没有被正确读取。如果你更换多个空间,它工作正常。 – david25272

+0

@ david25272 - 修正 – user667489

相关问题