5.雙set語句的應用(2個指針,一個pdv)
libname chapt3 'f:\data_model\book_data\chapt3';
data percent;
if _n_ = 1 then
set chapt3.summary(keep = cargosum);
set chapt3.empcount;
pctemps = numemps / cargosum;
run;
解讀:編譯後,記憶體中會出現雙指針;同時生成一個pdv;
首先在記憶體中開辟一個pdv,讀取資料集summary的第一個觀測,讀取變量cargosum的值并保留;
再讀取第二個資料集empcount,并計算pctemps=numemps / cargosum;輸出資料并傳回到data;
此時if語句不再執行,讀取資料集empcount的第二條觀測,并計算pctemps=numemps / cargosum;如此循環直到讀完empcount。
在商業實戰中最長見有兩種情況:一種是按照索引比對和更新資料;另一種是按照某一個變量排序,對排序變量實行set/set操作。
expenses含有flightid fltdate expenses三個變量
incomes含有flightid fltdate incomes三個變量
兩個表關聯一起的實作可以用proc sql的形式很容易的實作,但是當資料量大時,利用set/set語句的效率遠遠高于sql,尤其是對查詢表履歷索引之後。
proc datasets lib=chapt2;
modify income;
index create dteflt=(flightid fltdate)/nomiss unique;
quit;
data profit errors;
set chapt3.expenses;
set chapt3.income key = dteflt;
if _iorc_ = 0 then do;
profit =sum(income,- expenses);;
output profit;
end;
else do;
_error_ = 0;
output errors;
end;
run;
語句 key = dteflt是利用索引鍵來比對兩個表資料,自動生成的變量_iorc_ 為0,表示比對成功,_error_為0表示無錯誤資訊
總結如下:
對于兩個表有相同的表結構且被查詢的表已經建立了基于該相同變量的索引的情況下,set/set語句是最高效的方式;
主表的指針一般是從第一天一直掃描到最後一條,不走回頭路,但是對于被查詢表,可以根據索引跳躍資料指針;
對應的主表和建立索引的被查詢表一般不再排序;