在SAS数据步中执行过程步的简单示例
SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步。因此有时候DATA步只能利用PROC步执行完之后的结果。有时候这会带来一些不便。虽然有Call Execute例程,但该例程却是在DATA步执行完之后才能执行例程里面的代码。无法做到DATA步中的PROC步执行完之后才去执行DATA步内的其他代码。本文的目的就是简单介绍一种如何在DATA步中真正的执行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步执行中的某些结果来实现,也只能是以效率的损失为代价了。
在SAS数据步中执行过程步的简单示例的更多相关文章
- 数据从HDFS-->HIVE-->HBASE 执行过程
1.数据已经load进去hdfs 2.hive.hbase已经安装成功(我用的是hadoop 2.4 hbase 0.98.12 hive 1.2.1) 3.开始! 4.在hive建立表同时生成对应的 ...
- 创建并在项目中调用SQLSERVER存储过程的简单示例
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...
- Spring MVC中自定义拦截器的简单示例
1. 引言 拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter. 我们可以让普通的Bean实现HandlerIntercpetor接口或继承 ...
- (转)关于List中FindAll用法的一些简单示例
本文转载自:http://blog.csdn.net/luoxufeng/article/details/6925982 using System; using System.Collections. ...
- 关于C#List中FindAll用法的一些简单示例
using System; using System.Collections.Generic; public partial class List : System.Web.UI.Page { pro ...
- js中的Map对象的简单示例
es6提供一个对象Map, 其功能类似于java中的Map, 下面是java中的Map和js中的Map的简单对比: js中的Map.set()相当于java中的Map.put(), js中的Map.s ...
- 安卓中使用HttpURLConnection连接网络简单示例 --Android网络编程
MainActivity.java: package thonlon.example.cn.httpurlconnectionpro; import android.os.Bundle;import ...
- Synchronize执行过程
Synchronize执行过程及原理 在windows原生应用程序开发中,经常伴随多线程的使用,多线程开发很简单,难点就是在于线程的同步,在Delphi中提供了VC中不具备的一个过程Synchroni ...
- 在Web应用程序中执行计划任务(多线程)
在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...
随机推荐
- js 音乐播放器
在写之前先说下我遇到得两个问题,第一个问题是,在音乐标签,我希望得是切换数据做到得,但是出了问题,暂时为解决,第二个问题,页面切换时音乐继续播放由卡顿情况,未处理好. 好了,那我们开始做这个音乐播放器 ...
- 网易云课堂----java视频教程
http://study.163.com/course/introduction.htm?courseId=1003203062#/courseDetail?tab=1
- 如何将新建的项目完整的提交到gitlab上?
描述: 使用idea开发工具新建了一个项目工程,此时此刻工程没有任何的版本控制,代码存放在本地磁盘中,如果需要直接将项目工程代码提交到gitlab上,该如何操作呢? 因为当前没有版本控制,不能像正常的 ...
- JAVA高级-面试题总结
最近面试了一些公司,针对面试中遇到的问题在此记录,提升自己,造福大家 一.java源码相关 ArrayList创建和add等各种api使用原理 HashMap 的创建,put原理,和HashTable ...
- esLint 配置
默认eslint规则: 代码末尾不能加分号 ;(强迫症的我受不了)代码中不能存在多行空行:(这个我更也忍不了)tab键不能使用,必须换成两个空格:(超级不习惯)代码中不能存在声明了但未使用的变量:(这 ...
- Python 死锁现象
import time from threading import Thread,Lock,RLock def f1(locA,locB): locA.acquire() print('f1>& ...
- 博客 新址: https://pheromone.github.io/
该博客暂时调整歇业,小店地址暂时搬迁至: https://pheromone.github.io/ 该博客只做旧文章的维护工作. 博客 新址: https://pheromone.github.io ...
- nginx 支持ipv6设置
为了使nginx支持ipv6 访问需要做以下配置: 1.找到nginx的安装路径: 使用命令:whereis nginx 查看nginx安装路径: 进入nginx执行文件目录: 先用./nginx - ...
- java变量的自动提升与强制转换
所有的byte型.short型和char的值将被提升到int型 一个字节可以提升为4个字节 4个字节不可以降为一个字节 强制转换4个字节转换为一个字节 [丢失精度] byte b = 3; b = ( ...
- 爬虫基础之urllib库(代码演示)
# 自定义opener from urllib.request import ProxyHandler,build_opener from urllib.error import URLError ...