要做到這一點作爲一個宏功能,你需要閱讀整個數據集。我不確定SMALLEST()
函數是否可以正常工作。你想怎麼處理關係?這是一個找到第二小值並忽略重複值的程序。
%macro nextNB(ds,var);
%local dsid rc minv nv &var ;
%*----------------------------------------------------------------------
Open the dataset and link dataset variables to macro variables.
Loop until all observations are read.
-----------------------------------------------------------------------;
%let minv=.;
%let nv=.;
%let did=%sysfunc(open(&ds(keep=&var)));
%syscall set(did);
%do %while(not %sysfunc(fetch(&did)));
%if %sysevalf(. = &minv) %then %let minv=&&&var;
%else %if %sysevalf(&&&var <= &minv) %then %let minv=&&&var;
%else %if %sysevalf(. = &nv) %then %let nv=&&&var;
%else %if %sysevalf(&&&var < &nv) %then %let nv=&&&var;
%end;
%let rc=%sysfunc(close(&did));
&nv.
%mend nextnb;
data list;
do value= 5,9,5,7,8 ; output; end;
run;
%put %nextnb(list,value);
這將導致找到7作爲第二小的值。
如果您寧願返回5,因爲數據中有兩個5,那麼請將<=
更改爲<
。
來源
2016-03-08 17:39:30
Tom
你想做什麼?如果你已經有數據集中的數據,爲什麼要用宏代碼來分析它? – Tom
因爲最終,我將用該宏內的查詢替換數據集。 –
如果用查詢替換數據集,那麼宏將需要生成SAS代碼。所以你不能再創建一個返回值的函數式宏。 – Tom