SAS创建和使用索引(SAS INDEX)
一、概述
在合并数据集的时候,可以使用DATA步,但使用DATA 步时需要对KEY VALUE 排序,且KEY VALUE 的名字也必须一致;
也可以用PROC SQL ,不需要进行上述排序、重命名的步骤。 当数据量较小时使用哪种方式都不会影响代码的执行效率,但
1000万行且存在上百变量时上述code的执行效率严重下降。此时若使用index 则会提高代码运行效率。
INDEX 分为简单索引和复杂索引,也可以创建临时索引和永久索引(永久索引一但创建创功,就在文件存储地生成一个.sas7bndx的索引文件)
二、创建索引的方法:
1、DATA 步创建索引
使用(index=)选项在DATA 步创建索引,如下:
显式索引(Explicitly) INDEX=(ID/UNIQUE)
隐式索引(Implicitly) INDEX=(ID)
注:使用显失索引时,若KEY VALUE 不唯一,则会在log 页面生成错误信息。(故推荐用显式索引)。
简单索引:
DATA score(INDEX=(student_id));
SET test;
RUN;
1
2
3
也可以同时创建多个简单索引:
DATA score(INDEX=(student_id class));
SET test;
RUN;
1
2
3
复杂索引:
DATA score (INDEX = (INDEX_NAME = (ID CLASS))/UNIQUE);
SET test;
RUN; *INDEX_NAME 是创建的复杂索引的名字。
1
2
3
2、PROC DATASETS 步创建索引(为已存在的sas数据集创建索引,执行时间快,因为只读取KEY VALUE)
PROC DATASETS LIBRARY=;
MODIFY data_set_name;
INDEX CREATE var/UNIQUE NOMISS; *var是创建索引的key value;
INDEX CREATE index_name=(var1 var2)/UNIQUE;
QUIT;
注:在PROC DATASET 中删除索引用INDEX DELETE;
1
2
3
4
5
6
7
3、在PROC SQL 中创建索引;
PROC SQL ;
CREATE <UNIQUE> INDEX index_name ON column_name; *unique可选;
QUIT;
注:删除索引用DROP INDEX;
1
2
3
4
三、使用索引合并数据集
以下数据集1和2用作后续步骤的datasource.
数据集1: SCORE
DATA score;
input ID $ SCORES;
DATALINES;
1 80
2 85
3 60
4 75
5 90
6 99
;
RUN;
1
2
3
4
5
6
7
8
9
10
11
数据集2: AGES
DATA AGES;
INPUT ID $ AGE;
DATALINES;
2 18
3 19
4 16
7 20
8 19
9 15
;
RUN;
1
2
3
4
5
6
7
8
9
10
11
创建索引:
DATA SCORE(INDEX = (ID));SET SCORE;RUN;
DATA AGES (INDEX = (ID));SET AGES;RUN;
1
2
交集:
data S_AND_A;
SET SCORE;
_ERROR_ = 0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ = 0;
RUN;
1
2
3
4
5
6
只包含SCORE:
DATA SCORE_ONLY;
SET SCORE;
_ERROR_ =0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ NE 0 THEN AGE=0;
RUN;
1
2
3
4
5
6
只包含AGES:
DATA AGES_ONLY;
SET AGES;
_ERROR_ =0;
SET SCORE KEY = ID/UNIQUE;
IF _IORC_ NE 0 THEN SCORES=0;
RUN;
1
2
3
4
5
6
只包含SCORE 中不属于AGE的ID记录:
DATA S_NOTIN_A;
SET SCORE;
_ERROR_ = 0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ NE 0;
AGE = 0;
RUN;
1
2
3
4
5
6
7
只包含AGES中不属于SCORE的ID记录:
DATA A_NOTIN_S;
SET AGES;
_ERROR_ = 0;
SET SCORE KEY = ID/UNIQUE;
IF _IORC_ NE 0;
SCORES = 0;
RUN;
1
2
3
4
5
6
7
并集:
DATA SOA; SET SCORE(KEEP = ID) AGES(KEEP = ID);RUN;
PROC SORT DATA =SOA NODUPKEY; BY ID;RUN;
DATA SORA;
SET SOA;
_ERROR_ =0;
SET SCORE KEY=ID/UNIQUE;
IF _IORC_ NE 0 THEN SCORES = 0;
_ERROR_ =0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ NE 0 THEN AGE = 0;
RUN;
1
2
3
4
5
6
7
8
9
10
11
12
*note:
1:ERROR is reset to 0 to prevent an error condition that would write the contents of the PDV to the SAS log.
2: IORC is a automatic variable(program data vector PDV),it’s used with INDEXed dataset to check whether the direct read found a matching observation,for matched observation IORC =0; otherwise IORC NE 0;
3:不能在一个data步内同时创建和使用索引;
4:当原数据集被覆盖时,原索引丢失,如需使用需新建索引;
5:使用length 语句,防止字符串被截断*
---------------------
SAS创建和使用索引(SAS INDEX)的更多相关文章
- 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描
采用高速全扫描索引(index ffs) 为了避免全表扫描 参考原始: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 701 ...
- SAS 创建新变量
SAS 创建新变量 在对SAS数据集进行处理时,经常需要根据原有变量或变量值生成新变量.根据要实现功能的不同,SAS提供了多种方法,例如通过数据集选项RENAME=(RENAME语句).赋值语句.求 ...
- SQL Server 创建索引(index)
索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数 ...
- MySQL 创建索引(Create Index)的方法和语法结构及例子
MySQL 创建索引(Create Index)的方法和语法结构及例子 MySQL 创建索引(Create Index)的方法和语法结构及例子 CREATE INDEX Syntax CREATE ...
- 使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件
Azure的存储包含Storage Account.Container.Blob等具体的关系如下: 我们常用的blob存储,存放在Storage Account的Container里面. 目前有三种方 ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(1)系统简介和编程基础
SAS学习笔记之<SAS编程与数据挖掘商业案例>(1)系统简介和编程基础 1. SAS系统简介 1.1 SAS是先编译后执行的语言,data步标志着编译的开始. 数据指针:当前内存缓存区, ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程
SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...
- MySQL索引的Index method中btree和hash的优缺点
MySQL索引的Index method中btree和hash的区别 在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用 ...
- 聚合索引(clustered index) / 非聚合索引(nonclustered index)
以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是否 ...
随机推荐
- 做Data Mining,其实大部分时间都花在清洗数据
做Data Mining,其实大部分时间都花在清洗数据 时间 2016-12-12 18:45:50 51CTO 原文 http://bigdata.51cto.com/art/201612/52 ...
- 118、TensorFlow变量共享(二)
import tensorflow as tf # 在不同的变量域中调用conv_relu,并且声明我们想创建新的变量 def my_image_filter(input_images): with ...
- C#后台获取根路径
C#后台获取当前系统根路径: string absoluteurl = Context.Request.Url.AbsoluteUri.Replace(Context.Request.RawUrl, ...
- qtp的三种录制模式(转)
QTP提供三种不同的录制方式:正常录制(Normal Recording).模拟录制(Analog Recording)和低级录制(Low Level Recording). 1.正常录制(Norma ...
- 蓝桥杯:排它平方数-java
问题描述: 小明正看着 203879 这个数字发呆.原来,203879 * 203879 = 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同 ...
- Fatal Error -26000: Not enough memory (12320 bytes) for “new buffer in LrwSrvNetTaskIt 问题解决及lr脚本心得
Fatal Error -26000: Not enough memory (12320 bytes) for “new buffer in LrwSrvNetTaskIt 问题解决及lr脚本心得 2 ...
- W3C、MDN及html常用标签介绍
W3C 万维网(World Wide Web)是作为欧洲核子研究组织的一个项目发展起来的,在那里 Tim Berners-Lee 开发出万维网的雏形.Tim Berners-Lee- 万维网的发明人和 ...
- 解决:python安装mysqldb模块报 EnvironmentError: mysql_config not found
最近学习python操作mysql需要安装mysqldb模块 出现EnvironmentError: mysql_config not found 经网上查看,需要安装mysql客户端开发库libmy ...
- springCloud的使用02-----服务消费者(rest+ribbon)
1 将服务提供者做成集群模式 配置service-hi的端口为8762进行启动,配置service-hi的端口为8763进行启动, service-hi会在ecureka server上注册两个ser ...
- win10下logstash导入csv
input { file { path => ["E:/222/*.csv"] start_position => "beginning" } } ...