分享

sas优化技巧-条件语句的正确选择(select,if,where,having)

 kieojk 2016-07-21

1.       条件语句whereif的区别


从上图可以看出,where在原始数据进入PDV(program  data  vector)前对数据进行判断,是否满足条件,满足的条件的观测值进入PDV,不满足的则排除,PDV简单的说就是在编译过程中用于存储新建数据集变量值的空间。而if是将原始数据集中的所有值放入PDV后进行条件判断,满足条件的输出到新建数据集中。因此使用where条件筛选速度快于ifwhere只能从现有的sas数据集中选择观测,if语句还可以用input语句产生的观测中选Where可以作为选项进行应用。

运行速度比较:


结果比较: if条件语句首先是把sashelp逻辑库的class数据集前5个观测对象放入PDV,对满足年龄大于13岁的对象输出到新建数据集;而where是数据放入PDV前逐一进行判断,满足条件的前5个观测对象放入PDV,输出。所以if输出的观测对象个数时小于或等于obs指定值,而where是等于obs指定值。


Ifwhere关键不同点汇总:

2. selectif

当被判断变量为数值型变量,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.sqlwherehaving的区别

sas sqlwherehaving条件的选择规则类似于sas data set新建ifwhere的区别,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;

结果差异:


两者的主要差异:


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多