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)。