zoukankan      html  css  js  c++  java
  • 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 语句,防止字符串被截断*
    ---------------------

  • 相关阅读:
    「转」xtrabackup新版详细说明
    微博MySQL优化之路--dockone微信群分享
    分享的好处
    DBA的技能图谱
    高效运维--数据库坐而论道活动
    MySQL的诡异同步问题-重复执行一条relay-log
    把信送给加西亚读后感
    一次由于字符集问题引发的MySQL主从同步不一致问题追查
    nginx解决浏览器跨域问题
    kubernetes之pod调度
  • 原文地址:https://www.cnblogs.com/ly570/p/11161456.html
Copyright © 2011-2022 走看看