FCMP功能在PROC SQL中给出意外结果

时间:2018-01-30 01:05:02

标签: random sas proc-sql fcmp

我想把Rick Wicklin的宏(https://blogs.sas.com/content/iml/2015/10/05/random-integers-sas.html)生成随机数并将其转换为FCMP函数。使用%sysfunc(randbetween(1,100));或通过数据步骤调用时,FCMP函数按预期工作,但从proc sql开始,它始终返回值1.

proc fcmp outlib=work.funcs.funcs;
  function randbetween(min,max);
    return ( min + floor( ( 1 + max - min ) * rand("uniform") ) );
  endsub;
run;

工作示例:

data example;
  do cnt=1 to 1000;
    x = randbetween(1,100);
    output;
  end;
run;

破碎的SQL示例:

proc sql noprint;
  create table have as
  select randbetween(1,100)
  from sashelp.class
  ;
quit;

这是一个错误吗?或者我误用了什么?

SAS版本是SAS9.4TS1M5。 Windows 10x64。

编辑:当我将公式直接替换为SQL语句时,它按预期工作,因此它似乎与rand("uniform")的调用无关。

1 个答案:

答案 0 :(得分:0)

我认为这是因为程序和数据步骤在SAS中生成了不同的环境。通常,proc sql中的数据步骤和函数中的函数是不同的属性,即使它们具有相同的名称。一个例子是sum()函数。

在您的情况下,您还可以在 proc sql 闭包中使用%sysfunc(randbetween(1,100))

proc sql noprint;
  create table have as
  select %sysfunc(randbetween(1,100))
  from sashelp.class
  ;
quit;

这应该会给你预期的结果。