Sas 汇总当前行及其上一行中的变量

Sas 汇总当前行及其上一行中的变量,sas,Sas,这是我的意见: 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_

这是我的意见:

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;
我需要做的是针对每一项政策_no:

X_NET_PREMIUM_AMT = X_NET_PREMIUM_AMT OF PREVIOUS ROW + X_NET_PREMIUM_V_AMT OF CURRENT ROW.
到目前为止,没有问题

让我很难做到的是, 我需要在下次计算时更新X_净保费金额, 我会解释:

第1行(政策编号=1):

第2行(政策编号=1):

第3行(政策编号=1):

等等

不幸的是, 我不知道怎么做

谢谢你的帮助

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));

您要查找的是每个
保单号
X净保费
累计金额。因为覆盖原始变量不是一个好主意,我将为新变量命名为
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;

因此,当遇到不同的
保单号
时,
累计金额
将与
X净保费
金额相同,对于该
保单号
的其他行,它将是
X净保费
金额+累计金额。您的数据必须按
策略\u no
对此代码进行排序,这里就是这种情况。

现在我不确定您描述了什么-您需要最后一行和前两行的总和??如果您试图创建一个运行总数,请使用
retain
语句。如果此解决方案解决了您的问题,您可以接受它或对其进行表决。
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;
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));
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;