一、概述

在合并数据集的时候,可以使用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)的更多相关文章

  1. 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描

    采用高速全扫描索引(index ffs) 为了避免全表扫描 参考原始: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 701 ...

  2. SAS 创建新变量

    SAS  创建新变量 在对SAS数据集进行处理时,经常需要根据原有变量或变量值生成新变量.根据要实现功能的不同,SAS提供了多种方法,例如通过数据集选项RENAME=(RENAME语句).赋值语句.求 ...

  3. SQL Server 创建索引(index)

    索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数 ...

  4. MySQL 创建索引(Create Index)的方法和语法结构及例子

    MySQL 创建索引(Create Index)的方法和语法结构及例子 MySQL 创建索引(Create Index)的方法和语法结构及例子   CREATE INDEX Syntax CREATE ...

  5. 使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件

    Azure的存储包含Storage Account.Container.Blob等具体的关系如下: 我们常用的blob存储,存放在Storage Account的Container里面. 目前有三种方 ...

  6. SAS学习笔记之《SAS编程与数据挖掘商业案例》(1)系统简介和编程基础

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(1)系统简介和编程基础 1. SAS系统简介 1.1 SAS是先编译后执行的语言,data步标志着编译的开始. 数据指针:当前内存缓存区, ...

  7. SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...

  8. MySQL索引的Index method中btree和hash的优缺点

    MySQL索引的Index method中btree和hash的区别 在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用 ...

  9. 聚合索引(clustered index) / 非聚合索引(nonclustered index)

    以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是否 ...

随机推荐

  1. BUUCTF | 高明的黑客

    这一题一开始我没有理解"www.tar.gz"的涵义,还以为有一个其他的网站叫这个,后来才突然顿悟他也有可能是一个目录!!!地址栏输入”/www.tar.gz“ 然后就可以得到源码 ...

  2. (转)Groovy简介

    转:https://www.w3cschool.cn/groovy/ Groovy的官方网站是http://www.groovy-lang.org/ Groovy是一种基于JVM(Java虚拟机)的敏 ...

  3. 四两拨千斤,ARM是如何运作、靠什么赚钱的

    在智能手机.平板大行其道的今天,ARM这个名字我们几乎每天都要见到或者听到几次,作为编辑的我更是如此,每天涉及到的新闻总是或多或少跟ARM扯上关系,它还与Intel.AMD.NVIDA等公司有说不清道 ...

  4. asp label居中

    https://stackoverflow.com/questions/25245839/align-a-label-to-the-right-using-asp-net Try something ...

  5. 建站手册-网站建设: Web 标准

    ylbtech-建站手册-网站建设: Web 标准 1.返回顶部 1. http://www.w3school.com.cn/site/site_standards.asp 2. 2.返回顶部 1. ...

  6. Note1

    1.关于数据库主从备份与读写分离 主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中.从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己 ...

  7. maven导出工程pom文件中依赖的jar包

    在工程的pom文件里加上下面plugin, 然后执行mvn clean package -Dmaven.test.skip=true命令,就可以lib包收集起来了 <plugin> < ...

  8. HDU 3466 Proud Merchants(01背包)

    题目链接: 传送门 Proud Merchants Time Limit: 1000MS     Memory Limit: 65536K Description Recently, iSea wen ...

  9. C# 几进制 转换到几进制

    public string ConvertString(string value, int fromBase, int toBase) { int intValue = Convert.ToInt32 ...

  10. docker--shell和Exec格式

    shell格式 RUN apt-get install -y vim CMD echo "docker so easy" ENTRYPOINT echo "docker ...