如何在proc sql中获取观察的行号,类似于proc sql中的datastep的_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
.
.
.
答案 0 :(得分: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;
这几乎没有增加任何开销 - 几毫秒 - 并且实现了相同的结果,但安全性确信您有正确的订购。这两个查询(这个和Shipt&#39; s)在我的机器上几乎完全相同,在误差范围内(所有记录的2.95s对2.98s)。
答案 1 :(得分:2)
使用monotonic()函数。虽然在过去我已经读过这是一个无证件的功能(确实它没有出现在sas网站上,至少有one sas 'proceedings' document which makes use of it heavily
例如:
proc sql outobs=5;
select case mod(monotonic(), 2)
when 0 then "EVEN"
else "ODD"
end
from maps.africa;
quit;
将实现您的目标。