2015-07-10 67 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