SAS Proc sql行号

时间:2015-01-15 15:40:21

标签: sql sas proc-sql

如何在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
    .
    .
    .

2 个答案:

答案 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;

将实现您的目标。