5

如何在 proc sql 中获取观察的行号,类似于 proc sql 中数据步的 _N_?

例如

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

想:

Row
----------
    1 odd
    2 even
    3 odd
    .
    .
    .
4

2 回答 2

7

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

执行此操作的安全方法是创建一个viewwith_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;

这几乎不会增加任何开销 - 几毫秒 - 并获得相同的结果,但可以确保您有正确的排序。这两个查询(this 和 shipt's)在我的机器上运行的时间几乎相同,完全在误差范围内(所有记录为 2.95 秒对 2.98 秒)。

于 2015-01-15T16:06:31.843 回答
2

使用单调()函数。虽然在过去我读到这是一个未记录的功能(它确实没有出现在 sas 网站上,但至少有一个 sas 'proceedings' 文件大量使用它

例如:

proc sql outobs=5;
    select case mod(monotonic(), 2)
    when 0 then "EVEN"
    else "ODD" 
    end
    from maps.africa;
quit;

会达到你的目的。

于 2015-01-15T15:40:20.777 回答