我有一个医疗保健数据集,其中每个月注册一个主题,他们有一行数据,一个变量表示活跃注册的月份。因此,如果有人注册了12个月,那么他们将有12行。他们还有一个服务日期变量,给出了他们收到服务的确切日期。
我需要选择在服务日期之前连续6个月的注册和连续6个月的注册。这个月的具体日子无关紧要。重要的是只有服务和注册月份的月份和年份。
以下是我的数据:
service_dt MemberID enroll_month
11May2010 1 01Nov2009
11May2010 1 01Dec2009
11May2010 1 01Jan2010
11May2010 1 01Feb2010
11May2010 1 01Mar2010
11May2010 1 01Apr2010
11May2010 1 01May2010
11May2010 1 01Jun2010
11May2010 1 01Jul2010
15Jun2010 2 01Jun2010
15Jun2010 2 01Aug2010
因此,对于会员1,我们看到服务是在五月,所以如果月份是连续的,我需要选择2009年11月到2010年11月。对于会员2,服务是在6月,但是注册从6月到8月跳过... 7月不是注册月,所以我需要从最后一个队列中删除成员2。
答案 0 :(得分:0)
您需要最早注册月份后的前六个月的记录。您可以通过执行join
来获得符合此条件的所有成员。由于SQL标记,我假设您希望将其作为SQL语句:
select d.memberid
from data d join
(select min(year(service_dt) * 12 + month(service_dt)) as enroll_ym, d.*
from data d
) dym
on d.memberid = dym.memberid and
year(d.service_dt) * 12 + month(service_dt) between enroll_ym and enroll_ym + 5
group by d.memberid
having count(distinct month(service_dt)) = 6;
要获取原始行,您将加入原始数据。
答案 1 :(得分:0)
我接受了@Joe的建议,并将我的数据分成两组。在服务日期之前和服务日期之后。然后我按照Joe提供的代码提出了我之前提出的问题。但是,我只是稍作修改。
/* This code will focus on the months before the service date.*/
data eligibility_before2;
set eligibility_before;
by memberid descending monthid;
if first.memberid then counter = 0;
if dif(monthid) < -1 and mod(monthid, 100) ne 12 then counter = 0;
if mod(monthid, 100) eq 12 and dif(monthid) ne -89 then counter = 0;
counter+1;
if counter = 6 then output;
run;
/*This code will focus on enrollment months after the service date*/
data eligibility_after2;
set eligibility_after;
by memberid monthid;
if first.memberid then counter = 0;
if dif(monthid) > 1 and mod(monthid, 100) ne 1 then counter = 0;
if mod(monthid, 100) eq 1 and dif(monthid) ne 89 then counter = 0;
counter+1;
if counter = 6 then output;
run;
在此之后,只需将数据集合并在一起,指定memberid必须出现在BOTH数据集中,以包含在最终集合中。