Sql SAS-在服务日期前后6个月进行观察

Sql SAS-在服务日期前后6个月进行观察,sql,date,sas,Sql,Date,Sas,我有一个医疗数据集,其中每个月都有一个受试者注册。他们有一行数据,一个变量表示活跃注册的月份。因此,如果有人注册12个月,他们将在集合中有12行。他们还有一个服务日期变量,给出了他们接受服务的确切日期 我需要选择服务日期之前和之后的连续6个月的注册。一个月的具体日期是不相关的。重要的只是服务月份和注册月份 以下是我的数据: service_dt MemberID enroll_month 11May2010 1 01Nov2009 11

我有一个医疗数据集,其中每个月都有一个受试者注册。他们有一行数据,一个变量表示活跃注册的月份。因此,如果有人注册12个月,他们将在集合中有12行。他们还有一个服务日期变量,给出了他们接受服务的确切日期

我需要选择服务日期之前和之后的连续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,我们看到服务在5月份,因此如果月份连续,我需要选择2009年11月到2010年11月。对于会员2来说,服务是在6月,但报名从6月跳到8月……7月不是报名月,所以我需要将会员2从我的最后一批人中剔除

您需要最早注册月份后的前六个月的记录。通过执行联接,可以获得符合此条件的所有成员。由于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;

要获得原始行,您需要连接回原始数据。

我接受了@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必须出现在两个数据集中,才能包含在最终的数据集中。

有很多方法可以做到这一点。你尝试了什么?老实说,我在如何尝试这个问题上茫然不知所措……把我绊倒的是需要在观察过程中的服务日期。我曾考虑过使用计数,但这不能确保月份是连续的。我想从服务日期中减去注册月份,然后选择数字intnx或intck是您应该学习的函数;这就是你将如何确定月差的方法。否则,将其视为两个问题:选择6个月前的记录,以及选择6个月后的记录;这可能更容易。我感谢您的回答…但是我无法验证它是否有效,因为我的“加入”语句在SAS中未被识别。我必须做一些调试和调查,然后才能客观地决定这个答案是否解决了我的问题。@Terah。哎呀。我在查询中留下了一个额外的连接。现在它被删除了。嗯,也许我请求SQL是个错误。我对SQL了解不多,但听说如果您知道SAS编码,那么SQL就相对容易了。我试过你的方法,但还是没能奏效。我确信这是我自己的缺点,我向你道歉。我收到一条错误消息,告诉我work.data.data不存在。我不知道这是从哪里来的,因为我在代码中没有引用work.data.data的任何内容…我用自己的数据集替换了代码中对数据集的所有引用,所以我不知道我做错了什么。很抱歉在这件事上浪费了你的时间: