在SAS数据步中执行过程步的简单示例
2013-12-09 21:10
260 查看
SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步。因此有时候DATA步只能利用PROC步执行完之后的结果。有时候这会带来一些不便。虽然有Call Execute例程,但该例程却是在DATA步执行完之后才能执行例程里面的代码。无法做到DATA步中的PROC步执行完之后才去执行DATA步内的其他代码。本文的目的就是简单介绍一种如何在DATA步中真正的执行PROC步的方法。
程序如下(需求是取某个数据集中某个变量的所有可能取值(去重)):
输出结果:
日志输出:
上面代码实现的需求等价于下面的代码:
输出结果相同,但两者的效率却相差甚远:
可以看出,对于一个仅包含17个变量、5209条观测的数据集来说,实现同样一个简单需求,在DATA步中执行PROC步所花费的时间是直接执行PROC步的十几倍!
因此,如无必要,一般能直接执行PROC步的就直接执行。但有时候有些需求确实得借助PROC步执行中的某些结果来实现,也只能是以效率的损失为代价了。
程序如下(需求是取某个数据集中某个变量的所有可能取值(去重)):
/*定义准备执行PROC步的宏*/ %macro distinct_values; %let input_table = %sysfunc(dequote(&input_table)); %let column = %sysfunc(dequote(&column)); %let output_table = %sysfunc(dequote(&output_table)); proc sql; create table &output_table as select distinct &column from &input_table; %mend; /*自定义函数执行该宏*/ proc fcmp outlib=sasuser.funcs.sql; function get_distinct_values(input_table $, column $, output_table $); rc = run_macro('distinct_values', input_table, column, output_table); return (rc); endsub; run; /*在DATA步中执行该函数,从而达到间接执行该PROC步的效果*/ options cmplib = sasuser.funcs; data _null_; rc = get_distinct_values('sashelp.heart', 'Status', 'work.test1'); run;
输出结果:
日志输出:
上面代码实现的需求等价于下面的代码:
proc sql noprint; create table work.test2 as select distinct Status from sashelp.heart; quit;
输出结果相同,但两者的效率却相差甚远:
可以看出,对于一个仅包含17个变量、5209条观测的数据集来说,实现同样一个简单需求,在DATA步中执行PROC步所花费的时间是直接执行PROC步的十几倍!
因此,如无必要,一般能直接执行PROC步的就直接执行。但有时候有些需求确实得借助PROC步执行中的某些结果来实现,也只能是以效率的损失为代价了。
相关文章推荐
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 数据采集简单示例:采集爱帮网电话号码
- activiti部署、执行,完成简单示例
- Sql server Insert执行的秘密(上)一个最简单的INSERT分析 执行过程
- 最简单的CI框架入门示例--数据库取数据
- 简单示例归档与解档的过程
- postgresql 数据库中数据的导入导出(简单操作+示例)
- JS简单实现滑动加载数据的方法示例
- 《PHP---mysql数据连接简单示例》
- MVC简单执行过程
- 微信小程序简单实现form表单获取输入数据功能示例
- 千万级数据分页存储过程示例!
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- [Oracle] 存储过程中执行清除表数据
- sybase存储过程简单示例
- 利用JQuery显示不刷新页面获得服务器传来数据的最简单示例
- 简单的存储过程实例(插入100万数据时的状况)
- 利用批处理 存储过程和数据转换服务包执行sqlserver Agent下的Job
- MapReduce从HBase读写数据简单示例
- C# Post数据和接收简单示例