我是声明数据的新手,对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个月的连续会员资格。
答案 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)提供结果。