最小/最大功能解决方案在SAS

时间:2017-06-01 12:34:01

标签: sas

基本上,我想要做的是在改变表时使用min / max函数。我正在改变一个表,添加一个列,然后将该列设置为min / max函数的组合。但是,在SAS中,您无法使用汇总功能。有办法解决这个问题吗?

还有更多输入,但为了清晰起见,下面是简要版本!谢谢!

%let variable  = 42


    alter table X add Z float; 
        update X
            set C = min(max(0,500 - %sysevalf(variable)),0);

2 个答案:

答案 0 :(得分:1)

首先,我们删除%sysevalf(),不需要它们,并为可读性而格式化

alter table claims.simulation add Paid_Claims_NoISL float;
update claims.simulation
  set Paid_Claims_NoISL
    = min(
          max(0
              , Allowed_Claims -&OOPM
              , min(Allowed_Claims
                    ,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS 
                                    ,0
                                )
                )
              , &Ind_Cap_Claim
          )
       );

请注意,第一个min()只有一个参数。这导致你的错误。 SAS认为因为它只有1个输入,所以你想要汇总一个列,这在更新中是不允许的。

只要把它拿出来就可以了:

alter table claims.simulation add Paid_Claims_NoISL float;
update claims.simulation
  set Paid_Claims_NoISL
    = max(0
          , Allowed_Claims -&OOPM
          , min(Allowed_Claims
                ,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS 
                                ,0
                            )
            )
          , &Ind_Cap_Claim
      );

答案 1 :(得分:0)

要引用您需要使用的宏变量的值&amp ;.

%let mvar = 42;
proc sql;
 update X set C = min(max(0,500 - &mvar),0);
quit;

请注意,不需要使用宏函数%SYSEVALF(),因为当值&mvar是一个表达式而不是宏处理器时,SAS可以更轻松地处理这种情况。

%let mvar = 500 - 42;
proc sql;
 update X set C = min(max(0,&mvar),0);
quit;