SAS - 在服务日期之前和之后6个月保持观察

时间:2014-08-06 17:37:14

标签: sql date sas

我有一个医疗保健数据集,其中每个月注册一个主题,他们有一行数据,一个变量表示活跃注册的月份。因此,如果有人注册了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。

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数据集中,以包含在最终集合中。