下面sas代码中,为何where与if 筛选的结果不一样,而且where的筛选结果不理解。
dataa;inputidx@@;cards;111031304140;datab;inputidy@@;cards;111002120041400;datawherea...
data a;
input id x@@;
cards;
11 10 31 30 41 40
;
data b;
input id y@@;
cards;
11 100 21 200 41 400
;
data whereab;
merge a b;
where id>30;
proc print data=whereab;
run;
data ifab;
merge a b;
if id>30;
proc print data=ifab;
run;
你对if 和where 的解释深入浅出,非常感谢。
再追问个merge 和merge by 的差别。
顶上的例子涉及两个表:
id x id y
11 10 11 100
31 30 21 200
41 40 41 400
经过if 和where 的筛选结果是
id x y
41 40 400
(这个是if的结果,我已经完全明白了)
id x y
41 30 400
41 40 .
(这个是where的结果,我不理解为什么merge起来是这样的,因此做了下面两个变化)
data test1;
merge a b;
run;
data test2;
merge a b;
by id;
run;
test1 的结果我不理解, 如果这个弄懂了,那上面where 的结果自然通了。
id x y
11 10 100
21 30 200
41 40 400
test2的结果我明白,就是正常的 merge,加不加by 怎么还有区别呢?
那什么时候应该不加by呢? 我平时都是加的。
多谢多谢~~~ 展开
input id x@@;
cards;
11 10 31 30 41 40
;
data b;
input id y@@;
cards;
11 100 21 200 41 400
;
data whereab;
merge a b;
where id>30;
proc print data=whereab;
run;
data ifab;
merge a b;
if id>30;
proc print data=ifab;
run;
你对if 和where 的解释深入浅出,非常感谢。
再追问个merge 和merge by 的差别。
顶上的例子涉及两个表:
id x id y
11 10 11 100
31 30 21 200
41 40 41 400
经过if 和where 的筛选结果是
id x y
41 40 400
(这个是if的结果,我已经完全明白了)
id x y
41 30 400
41 40 .
(这个是where的结果,我不理解为什么merge起来是这样的,因此做了下面两个变化)
data test1;
merge a b;
run;
data test2;
merge a b;
by id;
run;
test1 的结果我不理解, 如果这个弄懂了,那上面where 的结果自然通了。
id x y
11 10 100
21 30 200
41 40 400
test2的结果我明白,就是正常的 merge,加不加by 怎么还有区别呢?
那什么时候应该不加by呢? 我平时都是加的。
多谢多谢~~~ 展开
1个回答
展开全部
主要原因是筛选的顺序有所不同,如果和你讲PDV 什么的未免太过无趣
通俗的来讲
if语句,就好比别人送快递到你家,你先请他进门再判断是不是你的,不是就退了
但是where语句呢,就好比,快递小哥在门口,你问他,是不是你的快递?不是,那就退了
所以理论上来说如果同样的是简单的筛选语句where效率优于IF语句。
顶上的句法也是一样的
一个是先MERGE好再筛选,就好比进门了再决定对不对(IF 语句)
一个是先筛选再Merge,就好比先问别人是不是,再决定是不是(WHERE语句)
通俗的来讲
if语句,就好比别人送快递到你家,你先请他进门再判断是不是你的,不是就退了
但是where语句呢,就好比,快递小哥在门口,你问他,是不是你的快递?不是,那就退了
所以理论上来说如果同样的是简单的筛选语句where效率优于IF语句。
顶上的句法也是一样的
一个是先MERGE好再筛选,就好比进门了再决定对不对(IF 语句)
一个是先筛选再Merge,就好比先问别人是不是,再决定是不是(WHERE语句)
追问
你对if 和where 的解释深入浅出,非常感谢。
我又追问了个问题,字数太多所以写在上面了,望解答~~
追答
MEGER 如果后面没有by ,那么就是按行号连接的
如:
data test1;
merge a b;
run;
也就是
a 的第一行接b的第一行,并且如果名称一样的变量会被后表覆盖。第二行接第二如,如此下去
如
data test2;
merge a b;
by id;
run;
那么就是按ID对接
a :
id x
01 x1
02 x2
b :
id y
01 y1
03 y2
data test1;
merge a b;
run;
的结果是:
id x y
01 x1 y1
03 x2 y2
而merge by 的结果是
id x y
01 x1 y1
02 x2 .
03 y2
当然,Merge by得先排序。
此外,这样难度的程序如果有问题是很好的,说明你在思考,但是更进一步,自己去SAS里面跑一下不就全明白了吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询