5.双set语句的应用(2个指针,一个pdv)
libname chapt3 'f:\data_model\book_data\chapt3';
data percent;
run;
解读:编译后,内存中会出现双指针;同时生成一个pdv;
首先在内存中开辟一个pdv,读取数据集summary的第一个观测,读取变量cargosum的值并保留;
再读取第二个数据集empcount,并计算pctemps=numemps / cargosum;输出数据并返回到data;
此时if语句不再执行,读取数据集empcount的第二条观测,并计算pctemps=numemps / cargosum;如此循环直到读完empcount。
expenses含有flightid fltdate
incomes含有flightid fltdate
两个表关联一起的实现可以用proc sql的形式很容易的实现,但是当数据量大时,利用set/set语句的效率远远高于sql,尤其是对查询表简历索引之后。
proc datasets lib=chapt2;
modify income;
index create dteflt=(flightid fltdate)/nomiss unique;
quit;
data profit errors;
run;
语句 key = dteflt是利用索引键来匹配两个表数据,自动生成的变量_iorc_ 为0,表示匹配成功,_error_为0表示无错误信息
总结如下:
对于两个表有相同的表结构且被查询的表已经建立了基于该相同变量的索引的情况下,set/set语句是最高效的方式;
主表的指针一般是从第一天一直扫描到最后一条,不走回头路,但是对于被查询表,可以根据索引跳跃数据指针;
对应的主表和建立索引的被查询表一般不再排序;