2017-06-01 150 views
0

基本上,我想要做的是在修改表格時使用最小/最大功能。我正在修改一個表格,添加一列,然後將該列設置爲最小/最大函數的組合。但是,在SAS中,您不能使用匯總功能。有沒有辦法解決這個問題?SAS中的最小/最大功能解決方案

還有更多的輸入,但爲了清晰起見,縮寫版本在下面!謝謝!

%let variable = 42 


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

你是不是想使這個'分鐘(MAX(0,500-42),0)'或'分鐘(MAX(0,500變量),0 )'?你有第二個,但我想知道你是否想要第一個。 – DomPazz

+0

我想要第一個。有很多變量被設置爲在程序開始時輸入的特定數字,我正在調用這些值本身。因此,表達式將評估爲0. – indiansrulz

+0

您是否嘗試使用SQL聚合函數'min()'和'max()'或SAS函數'min(,)'和'max(,)'?由於有多個參數,並且文本提到了「彙總」功能,該程序正在使用較晚的版本。 – Tom

回答

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()只有1個說法。這是導致你的錯誤。 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 
    ); 
0

要引用宏變量的值,您需要使用&。

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

注意沒有必要使用宏功能%SYSEVALF()因爲SAS可以更容易地處理的情況下,當值&mvar比宏處理器罐的表達式。

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

哦是的。我很抱歉,我忘了包括這一點。我在調用每個變量之前都有「&」 – indiansrulz

+0

我不斷收到錯誤:錯誤:列Paid_Claims_NoISL引用的值表達式不能直接包含彙總函數。 – indiansrulz

+0

在您發佈在MIN()函數下面的更復雜的代碼中,只有一個參數。因此,SAS認爲您希望彙總所有觀察結果,而在這個簡單的更新聲明中您無法做到這一點。你真的想要通過許多觀察的最小值?或者你只是想使用min()函數來設置最大值? – Tom