加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS编程技巧 -- 如何提取表的前N条记录

(2013-01-31 21:50:32)
标签:

杂谈

分类: SAS_Quick_Tips

从表里提取前 N 条记录是 SAS 程序员常见的数据处理,通常有两个目的:

1)排名后取前 N 名

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;
   score data=work.newdata;
run; 

 

2)obs 选项

这个是我们最最常用的方法,但是 DS2 和 所有 HP 的过程步目前都不支持此选项。

 

data firstn;

   set sashelp.class(obs=5);

run;


proc print data=oraclib.Hmeq_10k(obs=5);
run;

 

3)proc sql 加 obs 选项

proc sql;
   create table firstn as
   select * from sashelp.class(obs=5);
quit;

  

4)proc sql 的 inobs 选项

PROC SQL加obs选项与PROC SQL的inobs选项查询结果完全一样,只是使用inobs选项在SAS日志中会显示一行警告,而obs选项没有此警告。如果你对警告信息反感的话,可以使用obs选项。

 

proc sql inobs=5;

   create table firstn as

   select * from sashelp.class;

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;
   connect to oracle (path=dbpath user=dbname pw=dbpassword);
   execute (create table firstn as
      select * from Hmeq_10k where rownum<=5)
   by oracle;
   disconnect from oracle;
quit;

 

6) DS2

DS2 不支持obs选项,但是可以通过sql加limit功能实现。

 

libname oraclib oracle path=dbpath user=dbname pw=dbpassword;


proc ds2;
 data firstn(overwrite=yes);
   method run();
     set {select * from oraclib.Hmeq_10k limit 5};
   end;
 run;
quit;

 

7) HPDS2

使用HPDS2需要注意的是,返回的结果数据集的总记录条数等于5乘以节点总数,比如HPDS2的代码跑在10个节点上,则最后的记录条数为5*10=50。

 

libname GPLib greenplm
        server  ='dbserver'
        user    =dbuser
        schema  =dbschema
        password=dbpassword
        database=db;

 

option set=GRIDHOST="gridhost";
option set=GRIDINSTALLLOC="/opt/v930m2/INSTALL/TKGrid"; 

 

proc hpds2 data=GPLib.hmeq out=firstn;
 performance details;

 data DS2GTF.out;
  method run();
   set {select * from DS2GTF.in limit 5};
  end;
 enddata;
run;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有