SAS编程技巧 -- 如何提取表的前N条记录
(2013-01-31 21:50:32)
标签:
杂谈 |
分类: SAS_Quick_Tips |
从表里提取前 N 条记录是 SAS 程序员常见的数据处理,通常有两个目的:
1)排名后取前
2)基于测试或者调试目的取前 N 条记录
SAS 提供了多种方法提取表的前 N 条数据。
1)options obs=N;
这是个全局选项,一旦设置会对所有读表的操作起作用。不用改代码,很方便,但是有比较大的隐患。
比如,下面的代码使用逻辑回归模型进行预测,目的是取表 work.newdata 的前5条数据做预测,但是因为 options obs=5; 这个全局选项,预测时从模型参数文件 work.logisticmodel 中只取了前5条记录,导致模型预测结果出错。
options obs=5;
proc logistic inmodel=work.logisticmodel;
run;
2)obs 选项
这个是我们最最常用的方法,但是 DS2 和 所有 HP 的过程步目前都不支持此选项。
data firstn;
run;
proc print data=oraclib.Hmeq_10k(obs=5);
run;
3)proc sql
proc sql;
quit;
4)proc sql
PROC SQL加obs选项与PROC SQL的inobs选项查询结果完全一样,只是使用inobs选项在SAS日志中会显示一行警告,而obs选项没有此警告。如果你对警告信息反感的话,可以使用obs选项。
proc sql inobs=5;
quit;
WARNING: Only 5 records were read
from SASHELP.CLASS due to INOBS=
option.
5)proc sql pass-through
不喜欢或者不熟悉SAS SQL的同学,可以使用 pass-through 直接用数据库特有的sql语法来实现。只是这种写法局限性比较大,切换到其他的数据库,代码可能需要重写。另外,这种方式结果表是存在数据库中,而不是存在work库下。
proc sql;
quit;
6) DS2
DS2 不支持obs选项,但是可以通过sql加limit功能实现。
libname oraclib oracle path=dbpath user=dbname pw=dbpassword;
proc ds2;
quit;
7)
使用HPDS2需要注意的是,返回的结果数据集的总记录条数等于5乘以节点总数,比如HPDS2的代码跑在10个节点上,则最后的记录条数为5*10=50。
libname GPLib greenplm
option set=GRIDHOST="gridhost";
option
set=GRIDINSTALLLOC="/opt/v930m2/INSTALL/TKGrid";
proc hpds2 data=GPLib.hmeq out=firstn;
run;