2015-07-10 64 views
0

我是新来的索赔数据和相对较新的SQL ...并将非常感谢您的帮助。计算连续入学12个月前后12个月参考日期

我有类似这样的数据:

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个月的服务员持续成员身份。

+1

你介意提供预期的输出吗? – yukclam9

+1

请详细说明您的输入数据表。请准确了解过去和未来1​​2个月的规则。你在处理什么类型的医疗保健索赔,这是美国的保险吗?您提出的要求对医疗保险似乎极其简单,以及可能涉及的众多因素和情况。 12个月的未来覆盖的商业原因是什么?这些要求是什么? – WarrenT

+0

你的宏变量'&eff'从哪里来?您是否正在寻找从12个月前至12个月后连续入学的会员? (这是25个月,而不是24个!)除非您参与大数据,否则为什么要添加[ds2]标签?你为什么把你的问题标记为[持续]?这与这个统计概念无关。 –

回答

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带“B”为您的数据提到一个月的日期开始也使用开始,而不是“M”的中间。

+0

谢谢@DirkHosten。我会尝试这个建议并更新组。我对这个'm'表示歉意。我正在为董事会输入一个虚拟名单,而没有经过考虑 - 与开始日期一起去了。在我的数据中,日期始终是本月的第15天,因此我使用了'm'。 – Sri

+0

其实有条款可以写作count(*)EQ%eval(1 + 2 *&span)' –

0

如果您的源数据位于SAS数据集中,并且您可以在数据所在的服务器上运行SAS代码,那么以下方法非常高效。

%let span = 12; 

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

**对于每个新的部件或服务 开始一个新的连续服务间隔的interuption **;

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)的结果。

+0

感谢您的时间和输入@Dirk Horstern。是的,我的源代码是SAS数据文件。我今天会尝试这些代码并更新板子。由于还有一个问题需要处理,我无法尽快完成。 – Sri