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-已修复