一、概述

在合并数据集的时候,可以使用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. (转)maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程 方法二最简单

    转:https://blog.csdn.net/wabiaozia/article/details/52798194 准备工作: 假如我有一个自定义jar是:123456.jar,下载地址http:/ ...

  2. ARM与单片机到底有啥区别

    1.软件方面    这应该是最大的区别了.引入了操作系统.为什么引入操作系统?有什么好处?    1)方便.主要体现在后期的开发,即在操作系统上直接开发应用程序.不像单片机一样一切都要重新写.前期的操 ...

  3. springBoot JPA PageAble分页查询出错,PropertyReferenceException: No property creation found for type

    PropertyReferenceException: No property creation found for type @RequestParam(required = false, defa ...

  4. Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】

    基本认识linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场景 ...

  5. 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一

    目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...

  6. no sucn file or directory,scandir.......node-sass

    an 解决方法 运行 npm rebuild node-sass

  7. shell ## %% 变量内容的删除、替代和替换

    这个写的很清楚: https://www.cnblogs.com/zhaosunwei/p/6831529.html 自己的理解:以后补充 从前向后删除 # 符合替换字符的“最短的”那个 ## 符合替 ...

  8. FZU 2059 MM

    Description There is a array contain N(1<N<=100000) numbers. Now give you M(1<M<10000) q ...

  9. Comet OJ - Contest #12

    B 整个表格其实是一些联通块,取反操作不能跨连通块.所以直接统计一下每个连通块内数字不对的个数是不是偶数即可 #include<iostream> #include<cstring& ...

  10. form 表单的name

    form 中 的name 很重要, 1. 可以用来查找对应的input 2.form 提交之后 会用来作为参数列表的名字 3.enovia plm 中,name 会和 table 的field 进行对 ...