玩控 发表于 2019-8-15 14:05:27

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]
查看完整版本: sas优化技巧-条件语句的正确选择(select,if,where,having)