使用SAS 9.4的高级编程

SAS认证专业人士考试指南

English Version | ← 返回首页

1 考试概述

SAS认证专业人士:使用SAS 9.4的高级编程考试专为希望展示高级编程技能的经验丰富的SAS程序员而设计。

考试代码: A00-232

时长: 2小时

题目: 60-65道选择题

及格分数: 68%

前提条件: SAS认证专家:使用SAS 9.4的基础编程

2 考试内容领域

2.1 1. 使用SAS进行SQL处理 (35%)

2.1.1 创建表和视图

  • 使用PROC SQL创建表
  • 创建用于数据访问的视图
  • 理解表别名
/* 示例:使用PROC SQL创建表 */
PROC SQL;
    CREATE TABLE work.sales_summary AS
    SELECT 
        region,
        product,
        SUM(sales) AS total_sales,
        AVG(price) AS avg_price,
        COUNT(*) AS num_transactions
    FROM work.sales_data
    GROUP BY region, product
    HAVING total_sales > 10000
    ORDER BY total_sales DESC;
QUIT;

/* 创建视图 */
PROC SQL;
    CREATE VIEW work.high_value_customers AS
    SELECT customer_id, customer_name, total_purchases
    FROM work.customers
    WHERE total_purchases > 5000;
QUIT;

2.1.2 查询和筛选数据

  • 使用SELECT、WHERE和HAVING子句
  • 实现复杂的过滤逻辑
  • 使用子查询
/* 示例:复杂查询 */
PROC SQL;
    SELECT a.employee_id,
           a.employee_name,
           a.department,
           b.salary
    FROM work.employees AS a
    INNER JOIN work.salaries AS b
    ON a.employee_id = b.employee_id
    WHERE b.salary > (SELECT AVG(salary) FROM work.salaries)
    ORDER BY b.salary DESC;
QUIT;

2.1.3 连接

  • 内连接
  • 左、右和全外连接
  • 自连接
  • 交叉连接
/* 示例:各种连接类型 */
PROC SQL;
    /* 内连接 */
    SELECT a.*, b.sales
    FROM work.customers AS a
    INNER JOIN work.transactions AS b
    ON a.customer_id = b.customer_id;
    
    /* 左连接 */
    SELECT a.*, b.sales
    FROM work.customers AS a
    LEFT JOIN work.transactions AS b
    ON a.customer_id = b.customer_id;
    
    /* 自连接 */
    SELECT a.employee_name AS employee,
           b.employee_name AS manager
    FROM work.employees AS a
    LEFT JOIN work.employees AS b
    ON a.manager_id = b.employee_id;
QUIT;

2.2 2. 宏处理 (25%)

2.2.1 创建和使用宏变量

  • 使用%LET创建宏变量
  • 使用自动宏变量
  • 理解宏变量作用域
/* 示例:宏变量 */
%LET year = 2024;
%LET region = 'East';

PROC PRINT DATA=work.sales;
    WHERE year = &year AND region = &region;
    TITLE "&region地区&year年销售报告";
RUN;

/* 使用CALL SYMPUT */
DATA _NULL_;
    SET work.summary;
    WHERE region = 'West';
    CALL SYMPUT('west_total', total_sales);
RUN;

%PUT 西部总销售额: &west_total;

2.2.2 创建和使用宏

  • 使用%MACRO和%MEND定义宏
  • 使用宏参数
  • 在宏中实现条件逻辑
/* 示例:创建宏 */
%MACRO generate_report(dataset=, year=, output=);
    PROC MEANS DATA=&dataset NOPRINT;
        WHERE year = &year;
        VAR sales revenue;
        OUTPUT OUT=&output
               SUM(sales)=total_sales
               SUM(revenue)=total_revenue;
    RUN;
    
    PROC PRINT DATA=&output;
        TITLE "&year年汇总报告";
    RUN;
%MEND generate_report;

/* 调用宏 */
%generate_report(dataset=work.sales_data, 
                 year=2024, 
                 output=work.summary_2024);

2.2.3 宏函数

  • %EVAL和%SYSEVALF
  • %SUBSTR、%SCAN、%UPCASE
  • %STR和%NRSTR
/* 示例:宏函数 */
%MACRO process_data(start_year=, end_year=);
    %DO year = &start_year %TO &end_year;
        PROC PRINT DATA=work.sales_&year;
            TITLE "&year年销售";
        RUN;
    %END;
%MEND process_data;

%process_data(start_year=2020, end_year=2024);

2.3 3. 高级DATA步编程 (20%)

2.3.1 数组处理

  • 创建和使用一维数组
  • 创建和使用多维数组
  • 处理数组元素
/* 示例:数组处理 */
DATA work.quarterly_analysis;
    SET work.sales;
    
    ARRAY quarters{4} q1 q2 q3 q4;
    ARRAY pct_change{3} pct_q2 pct_q3 pct_q4;
    
    /* 计算百分比变化 */
    DO i = 2 TO 4;
        pct_change{i-1} = (quarters{i} - quarters{i-1}) / quarters{i-1} * 100;
    END;
    
    /* 计算年度总计 */
    annual_total = SUM(OF quarters{*});
    
    DROP i;
RUN;

2.3.2 哈希对象

  • 创建和使用哈希对象
  • 实现高效查找
  • 使用哈希迭代器
/* 示例:用于查找的哈希对象 */
DATA work.enriched_data;
    IF _N_ = 1 THEN DO;
        DECLARE HASH lookup(DATASET: "work.reference_data");
        lookup.DEFINEKEY('id');
        lookup.DEFINEDATA('category', 'description');
        lookup.DEFINEDONE();
    END;
    
    SET work.main_data;
    
    rc = lookup.FIND();
    IF rc = 0 THEN output;
    
    DROP rc;
RUN;

2.3.3 DO循环处理

  • 迭代DO循环
  • DO WHILE和DO UNTIL循环
  • 嵌套循环
/* 示例:高级DO循环 */
DATA work.compound_interest;
    principal = 10000;
    annual_rate = 0.05;
    
    DO year = 1 TO 10;
        interest = principal * annual_rate;
        principal = principal + interest;
        OUTPUT;
    END;
RUN;

/* DO UNTIL示例 */
DATA work.convergence;
    x = 1;
    iteration = 0;
    
    DO UNTIL (ABS(x - x_prev) < 0.001 OR iteration > 100);
        x_prev = x;
        x = x / 2 + 1 / x;
        iteration + 1;
        OUTPUT;
    END;
RUN;

2.4 4. 高级技术 (20%)

2.4.1 使用PROC FCMP

  • 创建自定义函数
  • 在DATA步中使用自定义函数
/* 示例:创建自定义函数 */
PROC FCMP OUTLIB=work.funcs.math;
    FUNCTION calculate_discount(amount, rate);
        discount = amount * rate;
        RETURN(discount);
    ENDSUB;
QUIT;

OPTIONS CMPLIB=work.funcs;

DATA work.with_discounts;
    SET work.sales;
    discount = calculate_discount(price, 0.10);
    final_price = price - discount;
RUN;

2.4.2 使用索引

  • 创建简单和复合索引
  • 理解何时使用索引
  • 使用WHERE与筛选IF
/* 示例:创建和使用索引 */
PROC DATASETS LIBRARY=work NOLIST;
    MODIFY sales;
    INDEX CREATE customer_id;
    INDEX CREATE region_product = (region product);
QUIT;

/* WHERE语句自动使用索引 */
DATA work.subset;
    SET work.sales;
    WHERE customer_id = '12345';  /* 使用索引 */
RUN;

3 学习资源

3.1 SAS官方资源

  1. SAS Programming 2: Data Manipulation Techniques - SAS官方培训
  2. SAS Programming 3: Advanced Techniques and Efficiencies - SAS官方培训
  3. SAS Macro Language 1: Essentials - SAS官方培训
  4. SAS SQL 1: Essentials - SAS官方培训

3.2 练习技巧

  1. 掌握SQL
    • SQL占考试的35%
    • 练习复杂连接和子查询
    • 理解SQL和DATA步之间的差异
  2. 理解宏
    • 练习编写参数化宏
    • 学习宏调试技术
    • 理解宏引用函数
  3. 高级DATA步
    • 掌握数组处理
    • 学习哈希对象技术
    • 练习复杂DO循环
  4. 性能优化
    • 理解何时使用索引
    • 学习高效的数据处理技术
    • 比较SQL与DATA步性能

4 常见陷阱

  1. 宏引用问题 - 正确使用%STR、%NRSTR、%BQUOTE
  2. 哈希对象语法 - 记住在使用前声明和定义
  3. SQL与DATA步混淆 - 理解何时使用每种方法
  4. 宏变量的作用域问题 - 理解局部与全局作用域

5 下一步

完成高级编程认证后:

  1. 在实际场景中应用高级技术
  2. 考虑专业认证(临床试验、数据挖掘等)
  3. 为SAS社区做出贡献

← 返回首页