如何在 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
.
.
.
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 秒)。
使用单调()函数。虽然在过去我读到这是一个未记录的功能(它确实没有出现在 sas 网站上,但至少有一个 sas 'proceedings' 文件大量使用它
例如:
proc sql outobs=5;
select case mod(monotonic(), 2)
when 0 then "EVEN"
else "ODD"
end
from maps.africa;
quit;
会达到你的目的。