设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2012|回复: 0

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

[复制链接]

23

主题

175

金钱

287

积分

入门用户

发表于 2019-8-15 14:05:27 | 显示全部楼层 |阅读模式

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

运行速度比较:
2.jpg
结果比较: if条件语句首先是把sashelp逻辑库的class数据集前5个观测对象放入PDV,对满足年龄大于13岁的对象输出到新建数据集;而where是数据放入PDV前逐一进行判断,满足条件的前5个观测对象放入PDV,输出。所以if输出的观测对象个数时小于或等于obs指定值,而where是等于obs指定值。
3.jpg
If和where关键不同点汇总:
4.jpg


2. select和if
当被判断变量为数值型变量,select处理效率高于if,而当变量为字符型时if条件判断效率较高。两者使用选择:
选择if:
a.       变量为字符型;
b.       变量值不均匀分布;
c.       较少判断条件。

选择select:
a.       数据规整分布;
b.       变量为数值型且条件间互斥,即判断条件间无交集;


总得来说条件间互斥的数值型变量或条件较多时选择select;其他if。且在数据量很大时两者的效率才能凸显。
  1. data test_select;

  2. set sashelp.class;

  3. select;

  4.   when (age le 12)  age_group='low-12';

  5.   when (age le 15)  age_group='13-15';

  6.   when (age ge 16) age_group='16-high';

  7.   otherwise;

  8. end;

  9. 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;
  1. /*having*/

  2. proc sql noprint;

  3. create table data_having as

  4.   select *,avg(age) as avgage from sashelp.class

  5.    group by sex

  6.     having age ge 15;

  7. quit;

  8. /*where*/

  9. proc sql noprint;

  10. create table data_where as

  11.   select *,avg(age) as avgage from sashelp.class

  12.    where age ge 15

  13.     group by sex;

  14. quit;
复制代码

结果差异:
5.jpg
两者的主要差异:
6.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表