SAS编程技术教程 (7)
- 格式:pdf
- 大小:252.78 KB
- 文档页数:19
由查询结果的第一个观测创建宏变 量
若在INTO子句中设定一个宏变量,则PROC SQL会将 SELECT语句中相应列的第一个观测值赋给该宏变量。
例23.5 将最新股票信息表ResDat.lstkinfo中第一个观测的stkcd和 lstknm赋值给宏变量stkcd和lstknm。用%PUT语句把宏变量的内容 写入SAS日志。
from RESDAT.YRRET; 348 quit; NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 0.00 秒 CPU 时间 0.00 秒
例23.1 比较普通查询语句与包含子查询的查询语句。 proc sql stimer; create table new as select a.stkcd,b.dret from resdat.lstkinfo a,resdat.dret b where a.stkcd=b.stkcd and a.stktype='A'; quit;
quit;
All Tables that Contain the Stkcd Column
Library
Name Member Name
Column Name
---------------------------------------------------------------
RESDAT DIST
类似的,可以使用DESCRIBE VIEW语句查看SASHELP视图是如 何构造的。 proc sql;
describe view sashelp.vtable;
1165 proc sql; 1166 describe view sashelp.vtable; NOTE: SQL 视图 SASHELP.VTABLE 定义为:
proc sql feedback; select * from resdat.yrret;
日志信息如下:
346 proc sql feedback; 347 select * from resdat.yrret; NOTE: Statement transforms to:
select YRRET.Stkcd, YRRET.Lstknm, YRRET.Date, YRRET.Yrtrds, YRRET.Yrret
用表词典来访问SAS系统信息
表词典(DICTIONARY tables)是特殊的只读PROC SQL表。这些表包含所有的SAS数据逻辑库、SAS数 据表、系统选项以及和SAS SESSION有关的外部文件 信息。
用DESCREIBE语句可以查看每个表词典是如何定义的,如: proc sql;
describe table dictionary.tables;
103
where stktype='A');
NOTE: 表 WORK.NEW 创建完成,有 29339 行,2 列。
NOTE: “SQL Statement”所用时间(总处理时间):
实际时间 0.07 秒
CPU 时间 0.07 秒
104 quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 0.00 秒 CPU 时间 0.00 秒 202 %put &stkcds; 000001,000002,000004
SQL过程编程
本章主要内容:
l使用PROC SQL选项建立和调试查询 l优化查询 l表词典(dictionary tables)定义以及作用。 l如何在PROC SQL中使用SAS宏工具 l如何使用SAS输出传输系统(ODS)来对 PROC SQL输出进行格式化。
使用PROC SQL选项来建立和调试查询
最高年收益为2.340115%
股票代码|Sto
年收益率|Yea
ck Code 日期|Date rly Return
------------------------------------------------------------
000002 1992-12-31 1.4000
000002 1993-12-31 0.0925
proc sql; select stkcd,lstknm into :stkcd,:lstknm from resdat.lstkinfo; quit; %put &stkcd &lstknm;
139 proc sql; 140 select stkcd,lstknm 141 into :stkcd,:lstknm 142 from resdat.lstkinfo; 143 quit; NOTE: “PROCEDURE SQL”所用时间(总处理时间) :
94 proc sql stimer; NOTE: “SQL Statement”所用时间(总处理时间):
实际时间 0.00 秒 CPU 时间 0.00 秒 95 create table new as select a.stkcd,b.dret 96 from resdat.lstkinfo a,resdat.dret b 97 where a.stkcd=b.stkcd and a.stktype='A'; NOTE: 表 WORK.NEW 创建完成,有 29339 行,2 列。 NOTE: “SQL Statement”所用时间(总处理时间): 实际时间 0.04 秒 CPU 时间 0.04 秒 98 quit; NOTE: “PROCEDURE SQL”所用时间(总处理时间): 实际时间 0.00 秒 CPU 时间 0.00 秒
语句格式: PROC SQL(OPTIONS)
可用PROC SQL选项对查询进行控制。 lINOBS=, OUTOBS=和LOOPS=选项通过限制观测和反复的数量 来减少程序运行的时间。 lEXEC和VALIDATE语句快速检查查询的语法。 lFEEDBACK选项展示出由SELECT *语句所选中的列。 l·PROC SQL STIMER选项记录和展示查询运行的时间。
实际时间 0.00 秒
CPU 时间 0.00 秒
比较两个查询的运行时间, 第一个使用连接查 询的CPU用时为0.04秒,第二个使用子查询 语句的CPU用时为0.07秒。一般来说,一个 连接会比同等情况的子查询运行起来要快。
优化查询
优化查询的方法包括: l使用简单索引index和复杂索引composite indexes l用set算符连接查询结果时,如果事先知道查询结果 中没有重复的观测,或者允许结果有重复观测,可以 使用关键词All来优化查询 l在创建表和视图时不用ORDER BY子句。 l使用线内视图代替临时表 l使用连接join代替子查询 l使用where表达式限制结果表的大小。
select * from DICTIONARY.TABLES; 1167 quit;
使用DICTIONARY.TABLES
例23.3 检索在RESDAT逻辑库下所有永久性表和视图的信息。 proc sql outobs=3;
title 'All Tables and Views in the RESDAT Library'; select libname, memname, memtype, nobs
000002 1994-12-30 -0.5404
在宏变量中实现连接
可以将一个列的值连接到一个宏变量中。这在建立一列宏 变量和常数的时候非常有用。使用SEPARATED BY 关键词设 定一个字符来分隔宏变量。
例23.7 用inobs选项限制proc sql读入前3个观测,再将其读 入到宏变量中。一般秒 CPU 时间 0.00 秒 144 %put &stkcd &lstknm; 000001 S深发展A
从汇总函数结果中创建宏变量
宏变量的一个比较有用的特性就是可以在SAS的标题中使用. 例23.6 找出某只股票历年的最高收益。 proc sql outobs=3; reset noprint; select max(yrret)into :myrret from resdat.yrret where stkcd='000002'; reset print; title "最高年收益为&myrret.%"; select stkcd,date,yrret from resdat.yrret where stkcd='000002'; quit;
---------------------------------------------------------------------------
RESDAT BANKIR
DATA
108
RESDAT BCHMKIR
DATA
80483
RESDAT BDID
DATA
1480
使用DICTIONARY.COLUMNS
proc sql inobs=3; select stkcd into :stkcds separated by ',' from resdat.lstkinfo; quit; %put &stkcds;
197 proc sql inobs=3; 198 select stkcd 199 into :stkcds separated by ',' 200 from resdat.lstkinfo; WARNING: Only 3 records were read from RESDAT.LSTKINFO 由于 INOBS= 选项。 201 quit; NOTE: “PROCEDURE SQL”所用时间(总处理时间):
如果一个查询结果中有多个观测,则该宏变量只包含第一个观测的 值。如果这个查询结果中没有观测,则不会创建宏变量。