2013-10-29 47 views
0

這是我輸入:總結從當前行變量和其以前的

data a; 
policy_no = 1; 
X_NET_PREMIUM_AMT = 1; 
X_NET_PREMIUM_V_AMT = 8; 
output; 
policy_no = 1; 
X_NET_PREMIUM_AMT = 2; 
X_NET_PREMIUM_V_AMT = 6; 
output; 
policy_no = 1; 
X_NET_PREMIUM_AMT = 9; 
X_NET_PREMIUM_V_AMT = 4; 
output; 
policy_no = 1; 
X_NET_PREMIUM_AMT = 12; 
X_NET_PREMIUM_V_AMT = 5; 
output; 
policy_no = 1; 
X_NET_PREMIUM_AMT = 6; 
X_NET_PREMIUM_V_AMT = 3; 
output; 
policy_no = 2; 
X_NET_PREMIUM_AMT = 18; 
X_NET_PREMIUM_V_AMT = 78; 
output; 
policy_no = 2; 
X_NET_PREMIUM_AMT = 25; 
X_NET_PREMIUM_V_AMT = 16; 
output; 
policy_no = 2; 
X_NET_PREMIUM_AMT = 91; 
X_NET_PREMIUM_V_AMT = 42; 
output; 
policy_no = 3; 
X_NET_PREMIUM_AMT = 123; 
X_NET_PREMIUM_V_AMT = 52; 
output; 
policy_no = 3; 
X_NET_PREMIUM_AMT = 4; 
X_NET_PREMIUM_V_AMT = 1; 
output; 
run; 

我需要做的就是爲每一個policy_no:

X_NET_PREMIUM_AMT = X_NET_PREMIUM_AMT OF PREVIOUS ROW + X_NET_PREMIUM_V_AMT OF CURRENT ROW. 

迄今爲止 - 沒有問題。

是什麼讓我很難做的是, 我需要的X_NET_PREMIUM_AMT下一個計算更新, 我將解釋:

列#1(policy_no = 1):

X_NET_PREMIUM_AMT = 0(no previouse row) + 8 = 8; 

行#2(policy_no = 1):

X_NET_PREMIUM_AMT = 8 + 6 = 14; 

行#3(policy_no = 1):

X_NET_PREMIUM_AMT = 14 + 4 = 18; 

等等....

不幸的是, 我不知道如何做到這一點...

會aprreciate你的幫助

+0

現在我不確定你描述的是什麼 - 你需要最後一行和前兩行的總和? – vasja

+1

如果您嘗試創建運行總計,請使用'retain'語句。 – Jeff

回答

1

你要找的是X_NET_PREMIUM_AMTpolicy_no累計總和。因爲覆蓋你的原始變量不是一個好主意,我會命名新變量cumsum

data b; 
set a; 
by policy_no; 
retain cumsum; 
if first.policy_no then cumsum=X_NET_PREMIUM_V_AMT; else cumsum=X_NET_PREMIUM_V_AMT+cumsum; 
run; 

所以遇到了不同的policy_nocumsum將是相同的X_NET_PREMIUM_V_AMT,這個policy_no的其他行這將是X_NET_PREMIUM_V_AMT+cumsum。對於此代碼,您的數據必須按policy_no排序。

+0

非常感謝! – user2518751

+0

如果此解決方案解決了您的問題,則可以接受該問題或將其升級。 – JT85

0
data out; 
    set a; 
    by policy_no; 
OUT_X_NET_PREMIUM_AMT = sum(X_NET_PREMIUM_AMT, lag1(X_NET_PREMIUM_AMT)); 
OUT_X_NET_PREMIUM_V_AMT = sum(X_NET_PREMIUM_V_AMT, lag1(X_NET_PREMIUM_V_AMT)); 
    if last.policy_no then output; 
run; 

使用LAG1()函數爲此 - 返回變量的以前的值。

也許你的意思是最後3個值:

OUT_X_NET_PREMIUM_AMT = sum(X_NET_PREMIUM_AMT, lag1(X_NET_PREMIUM_AMT), lag2(X_NET_PREMIUM_AMT)); 
OUT_X_NET_PREMIUM_V_AMT = sum(X_NET_PREMIUM_V_AMT, lag1(X_NET_PREMIUM_V_AMT), lag2(X_NET_PREMIUM_V_AMT));