计算参考日期前后12个月的连续入学人数

时间:2015-07-10 01:52:39

标签: sql date db2 sas continuous

我是声明数据的新手,对SQL来说相对较新......并且非常感谢您的帮助。

我的数据类似于:

Customer    Group   Member  ServiceDt
ABCDE       123     1111    01-Jan-12
            123     1111    01-Feb-12
            123     1111    01-Mar-12
            123     1112    01-Feb-12
            123     1112    01-Mar-12
FGHIJ       456     1116    01-Feb-12
KLMNO       567     1117    01-Mar-12
            678     1118    01-Feb-12
            789     1119    01-Mar-12

会员每月可以有一个条目来表示有效的注册日期。因此,一个成员可以有两行24行'值得注册。另一个可能只有五行,依此类推......每个成员都是一个团队的一部分,而团队又是客户的一部分。 (客户可以有多个组 - 每个组中有许多成员,每个成员每月有一行)。

我需要评估服务日期后12个月的持续注册,然后是12个月(服务日期之前和之后的一年注册),然后按照CUSTOMER和GROUP编号将其汇总到组。

我尝试过intck / intcx函数,但似乎做错了。当我尝试第一次。最后。方式,我迷路了。这个数据对我来说太新了。:)

以下是我到目前为止尝试的代码片段(不包括服务器连接内容):

beg1ylag = intnx('month',&eff ,-12,'m');
add1yfut = intnx('month',&eff , 12,'m');

If first.member_id then do;
    mth_cnt     = 0;
    lag_mth_cnt = 0;
    fut_mth_cn  = 0;
End;

 mth_cnt+1;
  if eff_dt < servicedt then lag_mth_cnt+1;
  if eff_dt > servicedt then fut_mth_cnt+1;

  if last.member_id then output;


Proc SQL;
Select (x,y,z

 beg1ylag = intnx('month',servicedt,-12,'m');
 add1yfut = intnx('month',servicedt, 12,'m');

call symput('_beg1ylag',cats("'",year(beg1ylag),'-',put(month(beg1ylag),z2.),"Middle'"));
call symput('_add1yfut',cats("'",year(add1yfut),'-',put(month(add1yfut),z2.),"Middle'"));
Quit;

我得到的结果是空行。我不知道我在做什么或做错了......请指导我。此外,请注意,服务不固定。每个成员都可以有不同的成员 - 如上所示。最终,我需要能够挑选成员并按照他们的团体编号对他们进行分组,如果他们在服务中心有24个月的连续会员资格。

2 个答案:

答案 0 :(得分:0)

如果我能很好地解释你的问题,你需要

%let eff = '01Feb2012'd;
%let span = 12;

Title "Members enrolled continuously from &span months before &eff till &span months after &eff";
proc sql;
    select Customer, Group, Member
    from   enrol
    where  ServiceDt between intnx('month',&eff ,-&span,'b') and intnx('month',&eff ,+&span,'b')
    group by Customer, Group, Member
    having count(*) EQ 1 + INTCK('month', intnx('month',&eff ,-&span,'b'), intnx('month',&eff ,+&span,'b'));
quit;

请注意,你应该使用intnx和&#39; b&#39;开始,而不是&#39; m&#39;对于中间,因为您的数据也提到了月份日期的开始。

答案 1 :(得分:0)

如果您的源数据位于SAS数据集中,并且您可以在数据所在的服务器上运行SAS代码,则以下内容非常有效。

%let span = 12;

Data Continuous (keep=Customer Group Member eff);
    set Service;
    by Customer Group Member ServiceDt;

**对于每个新成员或服务中断 开始新的连续服务间隔**;

    retain From;
    if first.Member or dif(ServiceDt) GT 31 
        then From = ServiceDt;

**如果服务在至少2个月前开始 然后跨越几个月前是中心 足够长的连续服务间隔**;

    if INTCK('month', From, ServiceDt) GE %eval(2 * &span) then do;
        eff = intnx('month', ServiceDt,-&span,'b');
        output;
    end;
run;

它会立即为每个可能的服务间隔中心(= eff)提供结果。