sas优化技巧-条件语句的正确选择(select,if,where,having)
1. 条件语句where和if的区别
从上图可以看出,where在原始数据进入PDV(programdatavector)前对数据进行判断,是否满足条件,满足的条件的观测值进入PDV,不满足的则排除,PDV简单的说就是在编译过程中用于存储新建数据集变量值的空间。而if是将原始数据集中的所有值放入PDV后进行条件判断,满足条件的输出到新建数据集中。因此使用where条件筛选速度快于if。where只能从现有的sas数据集中选择观测,if语句还可以用input语句产生的观测中选。Where可以作为选项进行应用。
运行速度比较:
结果比较: if条件语句首先是把sashelp逻辑库的class数据集前5个观测对象放入PDV,对满足年龄大于13岁的对象输出到新建数据集;而where是数据放入PDV前逐一进行判断,满足条件的前5个观测对象放入PDV,输出。所以if输出的观测对象个数时小于或等于obs指定值,而where是等于obs指定值。
If和where关键不同点汇总:
2. select和if
当被判断变量为数值型变量,select处理效率高于if,而当变量为字符型时if条件判断效率较高。两者使用选择:
选择if:
a. 变量为字符型;
b. 变量值不均匀分布;
c. 较少判断条件。
选择select:
a. 数据规整分布;
b. 变量为数值型且条件间互斥,即判断条件间无交集;
总得来说条件间互斥的数值型变量或条件较多时选择select;其他if。且在数据量很大时两者的效率才能凸显。
data test_select;
set sashelp.class;
select;
when (age le 12)age_group='low-12';
when (age le 15)age_group='13-15';
when (age ge 16) age_group='16-high';
otherwise;
end;
run;
3.sql里where和having的区别
sas sql里where和having条件的选择规则类似于sas data set新建if和where的区别,having是对sql语句中groupby分割后的亚组数据集进行条件筛选,先按亚组计算将计算结果新变量放入新建表(tables)中,在按照having指定条件对亚组进行筛选;因此having需在group by语句后,而where是对整个数据集进行筛选,先筛选出符合条件的观测对象,再按照group by分割的亚组进行计算,产生的新变量再放入新建表中,where语句需在group by之前;而当无groupby语句时having的作用相当于where;
/*having*/
proc sql noprint;
create table data_having as
select *,avg(age) as avgage from sashelp.class
group by sex
having age ge 15;
quit;
/*where*/
proc sql noprint;
create table data_where as
select *,avg(age) as avgage from sashelp.class
where age ge 15
group by sex;
quit;
结果差异:
两者的主要差异:
页:
[1]