|
|
楼主

楼主 |
发表于 2010-10-22 13:20:42
|
只看该作者
跟crackman读SAS程序(75)--Merge SQL在合并数据集上的差异
From crackman's blog
<p>data crackman1(index=(x));</p>
<p>input x y;</p>
<p>datalines;</p>
<p>1 2</p>
<p>3 4</p>
<p>5 6</p>
<p>;</p>
<p>run;</p>
<p>data crackman2(index=(x));</p>
<p>input x z;</p>
<p>datalines;</p>
<p>1 8</p>
<p>3 9</p>
<p>5 7</p>
<p>;</p>
<p>run;</p>
<p>data crackman;</p>
<p>merge crackman1 crackman2;</p>
<p>by x;</p>
<p>run;</p>
<p>proc sql;</p>
<p>create table crackman as select a.x,a.y,b.z from crackman1 a,crackman2 b where a.x=b.x;</p>
<p>quit;</p>
<p> </p>
<p>两种方法都可以实现既定的目标</p>
<p>但是各有什么优缺点呢?</p>
<p>MERGE:</p>
<p>优点:</p>
<p>1.除非内存限制,否则对要合并的数据集的观测总数是没有限制的</p>
<p>2.可以通过DATA STEP里面的DO LOOP和ARRAY以及其他一些MERGE的功能来实现比较复杂的逻辑合并</p>
<p>3.可以通过对要合并数据集的多个变量的比较进行合并</p>
<p>缺点:</p>
<p>1.要合并的数据集必须先排序或者建立索引</p>
<p>2.根据多个变量或者一个变量的比较进行数据集合并,那么前提是要合并的数据集必须包括要比较的变量。</p>
<p>3.按照指定的变量进行严格比较,获得所需要的结果,而且必须至少有一个观测是匹配成功的。</p>
<p>因为MERGE在DATA STEP里面,在匹配的过程中,如果匹配成功之后,不会再重复读取已经匹配成功的数据观测,例如:如果crackman1的第一个观测和crackman2的第一个观测匹配成功了,那么在进行第二个观测匹配时,就不会再去读取第一个观测的数据,所以效率会高些。但是SQL不是这样的,SQL是多对多的扫描匹配,产生一个cartesian product,笛卡尔乘积,所以相对MERGE显得速度和效率要慢一些</p>
<p>SQL:</p>
<p>优点:</p>
<p>1.数据集不需要排序或者建立索引,当然如果建立索引更好</p>
<p>2.多个数据集可以一次合并,而且不要求合并的数据集含有共同的变量</p>
<p>3.SQL可以创建数据集,view以及report query。</p>
<p>缺点:</p>
<p>1.一次合并的数据集数据不能超过32个</p>
<p>2 SQL实现数据集间的复杂的连接关系上比MERGE要复杂点</p>
<p>3.SQL在合并数据集过程中对系统资源的消耗要高于MERGE(原因开始说了很清楚)。</p>
<p>data crackman3(index=(c=(x y)));<br>
input x y $12.@;<br>
datalines;<br>
1 crack<br>
1 man<br>
2 crackman<br>
run;<br>
data crackman4(index=(d=(x z)));<br>
input x z $12. @;<br>
datalines;<br>
1 woody<br>
1 wang<br>
2 woodywang<br>
;<br>
run;<br>
data crackman5;<br>
merge crackman3 crackman4;<br>
by x;<br>
run;<br>
proc print;<br>
run;<br>
proc sql;<br>
create table crackman6 as select a.x,a.y,b.z from crackman3 a ,crackman4 b where a.x=b.x;<br>
quit;<br>
proc print;<br>
run;</p>
<p>看看结果就很清楚了</p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/c4cf52b1ef327ec137d3ca84.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%B8%FAcrackman%B6%C1sas%B3%CC%D0%F2">跟crackman读sas程序</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/c4cf52b1ef327ec137d3ca84.html#comment">查看评论</a> |
|