SAS Proc sql行号

und*_*ock 4 sql sas proc-sql

如何在proc sql中获取观察的行号,类似于procsql中的datastep的_N_?

例如

proc sql outobs=5;
    select case mod(<something>, 2)
    when 0 then "EVEN"
    else "ODD" 
    end
    from maps.africa
end;
Run Code Online (Sandbox Code Playgroud)

想:

Row
----------
    1 odd
    2 even
    3 odd
    .
    .
    .
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 6

Monotonic()确实存在并且在某些情况下可能有用,但它与行号不同,并且使用起来很危险,特别是考虑到SQL是一种高度优化的语言,可以很好地将查询分成多个线程 - 在这种情况下monotonic()会失败实现你想要的.特别是它可以在不同的数据集上,在不同的SAS安装上,甚至在不同的日子里表现不同.

安全的方式做,这是创建一个view_n_复制到一个永久的变量.

data africa_v/view=africa_v;
  set maps.africa;
  rownum=_n_;
run;

proc sql;
  select case mod(rownum, 2)
    when 0 then "EVEN"
    else "ODD" 
    end
    from africa_v;
quit;
Run Code Online (Sandbox Code Playgroud)

这几乎没有增加任何开销 - 几毫秒 - 并取得了相同的结果,但安全性确信您有正确的订购.这两个查询(这个和shipt)在我的机器上运行几乎相同的时间,在误差范围内(所有记录的2.95s对2.98s).