使用SAS 9.4的高级编程
SAS认证专业人士考试指南
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 = ®ion;
TITLE "®ion地区&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官方资源
- SAS Programming 2: Data Manipulation Techniques - SAS官方培训
- SAS Programming 3: Advanced Techniques and Efficiencies - SAS官方培训
- SAS Macro Language 1: Essentials - SAS官方培训
- SAS SQL 1: Essentials - SAS官方培训
3.2 练习技巧
- 掌握SQL
- SQL占考试的35%
- 练习复杂连接和子查询
- 理解SQL和DATA步之间的差异
- 理解宏
- 练习编写参数化宏
- 学习宏调试技术
- 理解宏引用函数
- 高级DATA步
- 掌握数组处理
- 学习哈希对象技术
- 练习复杂DO循环
- 性能优化
- 理解何时使用索引
- 学习高效的数据处理技术
- 比较SQL与DATA步性能
4 常见陷阱
- 宏引用问题 - 正确使用%STR、%NRSTR、%BQUOTE
- 哈希对象语法 - 记住在使用前声明和定义
- SQL与DATA步混淆 - 理解何时使用每种方法
- 宏变量的作用域问题 - 理解局部与全局作用域
5 下一步
完成高级编程认证后:
- 在实际场景中应用高级技术
- 考虑专业认证(临床试验、数据挖掘等)
- 为SAS社区做出贡献