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,看看是否 ...
随机推荐
- java使用开源类库Tesseract实现图片识别
Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选. Tess4J则是Tesseract在Java PC上的应用 Tesseract的OCR引擎最先由HP实验 ...
- 20175203 2018-2019-2 实验一《Java开发环境的熟悉》实验报告
20175203 2018-2019-2 实验一<Java开发环境的熟悉> 实验内容及步骤 使用JDK编译.运行简单的Java程序 此代码较为基础,主要是为了让我们熟悉JDK编程环境及如何 ...
- Oracle 表空间、用户
一.表空间 临时表空间 创建临时表空间范例 CREATE TEMPORARY TABLESPACE duke_temp /* 临时表空间名称:duke_temp */ tempfile 'C:\ora ...
- Mac定时执行脚本_服务launchctl
Mac 设置自动执行定时任务, 步骤: 1. 编写plist 2.将plist放入该目录下 ~/Library/LaunchAgents 3.命令启动 添加: launchctl load /Syst ...
- ssd存储的SLC、MLC、TLC闪存芯片颗粒有什么区别?
SLC = Single-Level Cell ,即1bit/cell,速度快寿命长,价格贵(约MLC 3倍以上的价格),约10万次擦写寿命: MLC = Multi-Level Cell,即2bit ...
- python让人头大的装饰器...decorator带参不带参用法和原理.,..
0. 概念什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. python中的装饰器分为两类:函数装饰器和类装 ...
- 网络命令-nc(一)
一直在linux环境下编程,但却没有用过nc命令,不过最近发现Netcat这个命令-nc,发现真的蛮强大的, 为了备忘,就写了这个博客吧,不求全,只求把自己觉得很有用的命令整理出来,这篇文章估计要长期 ...
- CF561做题
C题: 一期思路:我们发现如果x,y满足条件,那么{x,-y} {-x,y} {-x,-y}也满足条件.那么我们可以只讨论|x| |y|是否满足条件,如果满足条件,那么对ans的贡献是|x|出现次数* ...
- 方法Join()
等待线程结束:jion() 谦让: yeild() 睡眠: sleep() jion和sleep和yeild之间有什么区别呢? 首先介绍一下jion(): 如果想让主线程等待子线程执行完毕之后再继续运 ...
- SSD如何设置预留空间OP(Over-Provision)
Over-Provision操作指南 SSD OP全称是(Over-Provision), 中文名预留空间, 指用户不可操作的容量,大小为SSD实际容量减去用户可用容量.简单来说over-provis ...