我的数据如下所示。
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 :(得分: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.x
和by
变量,方法是自动查看输入数据集中的下一行。
通常by
语句要求对数据集进行排序,但notsorted
选项会覆盖此选项,并允许您标识变量从一个值更改为另一个值的任何行,而不管顺序如何。