我有一张桌子,上面有日期,并且该成员随时间变化。我想知道成员的开始和结束时间。如果该成员开始和结束然后重新启动,则需要使用其他指示符。
我所拥有的样品(对不起,我不知道如何在此处制作桌子):
成员yyyymm
Jim 201603
Jim 201606
201609年7月
鲍勃201709
鲍勃201712
Jim 201806
Jef 201806
Jef 201809
我尝试了proc sql语句,该语句查找最小和最大日期,但是如果成员重新启动,则最大日期错误(下面的代码A)。我还尝试了一个数据步骤,并说该数据未正确排序(下面的代码B)
代码A
proc sql;
create table tst as
select
member,
max(yyyymm) as effective_until,
min(yyyymm) as effective_from
from tbl
group by 1,2;
quit;
代码B
data tst;
count + 1;
by member;
if first.member then count = 1;
run;
我希望的是
成员yyyymm ID
Jim 201603 1
2016年7月1日1
201609年1月1日
鲍勃201709 2
鲍勃201712 2
Jim 201803 3
Jef 201806 4
2018年9月4日
答案 0 :(得分:0)
proc sort data=have;
by yyyymm member;
data want;
set have;
by yyyymm member;
if first.member then id+1;
run;
答案 1 :(得分:0)
因此,请尝试从先前调用返回参数的lag函数。因此,这里它返回上一次观察的值(但要小心处理)。当成员不同于上次观察时,只需更改您的ID。例如,添加1。
data have;
length member $3 yyyymm $6;
input member yyyymm;
cards;
Jim 201603
Jim 201606
Jim 201609
Bob 201709
Bob 201712
Jim 201806
Jef 201806
Jef 201809
run;
data want;
set have;
if lag(member)^=member then id+1;
run;