首页 > 解决方案 > OPEN 中的 Where 子句查找唯一值

问题描述

我正在尝试编写一个宏,它将返回数据集中的观察数,带有一个选项“where”子句,它将返回满足该条件的观察数。

我一直在使用OPEN SAS 函数来执行此操作,例如以下示例:

%macro test(WHERE); 
 %let DSID = %sysfunc(open(sashelp.cars(where=(&WHERE)), i)); 
 %let NOBS = %sysfunc(attrn(&DSID, NLOBSF) ); &NOBS 
 %let RC   = %sysfunc(close(&DSID));
%mend test;

%put %test(WHERE=make='Audi'); 

问题:

是否有特定的WHERE子句使它返回特定列的唯一值(例如 Make)?类似distinct能力的东西PROC SQL(我不能实际使用PROC SQL,因为输出不再适用%put

标签: sas

解决方案


没有where会返回唯一值的。

您可以使用该doSubL功能在辅助会话中提交步骤代码。侧会话不会注册为调用提交流中的步骤。

例子:

%macro cars_distinct(var=);
  %local list rc;
  %let rc = %sysfunc(doSubL(%str(
    proc sql noprint; 
      select distinct &var into :list separated by ' '
      from sashelp.cars
    quit;
  )));
  &list.
%mend;

%put %cars_distinct(var=make);

注意:与循环遍历不同的值列表时重复执行某些过程(或其他宏调用)相比,BYCLASS处理通常是最佳实践。


推荐阅读