要做到这一点作为一个宏功能,你需要阅读整个数据集。我不确定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