SAS Proc sql 行号
SAS Proc sql row number
如何在 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() 函数。虽然在过去我读到这是一个未记录的函数(它确实没有出现在 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;
会达到你的目的。
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;
这几乎没有增加任何开销 - 几毫秒 - 并实现了相同的结果,但安全地确信您有正确的顺序。这两个查询(this 和 shipt's)运行 在我的机器上几乎相同的时间,完全在误差范围内(所有记录为 2.95s vs 2.98s)。
如何在 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() 函数。虽然在过去我读到这是一个未记录的函数(它确实没有出现在 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;
会达到你的目的。
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;
这几乎没有增加任何开销 - 几毫秒 - 并实现了相同的结果,但安全地确信您有正确的顺序。这两个查询(this 和 shipt's)运行 在我的机器上几乎相同的时间,完全在误差范围内(所有记录为 2.95s vs 2.98s)。