二、文獻(xiàn)中如果不排序產(chǎn)生的錯(cuò)誤,PDV過(guò)程
程序如下(數(shù)據(jù)集產(chǎn)生過(guò)程不再贅述)
data bonus;
set sale_amount ;
do while(not(low le amount le high));
set bonus_criteria ;
end;
bonus=salary*factor;
run;
1.編譯后,PDV含有6個(gè)顯性變量:low high factor name salary amount. 同時(shí)這6個(gè)變量初始化值變?yōu)槿笔?/p>
Low | High | Factor | Name | Salary | Amount |
. | . | . | . | . | . |
2.接下來(lái)系統(tǒng)讀取sale_amount中的第一條觀測(cè),進(jìn)入Do循環(huán)。
Name | Salary | Amount |
Jim | 500 | 200 |
由于amount=200 ,并且此時(shí)程序沒(méi)執(zhí)行到sale_criteria,又因?yàn)閘ow=. high=. 所以low le amount le high為假,所以while語(yǔ)句中為真,執(zhí)行DO語(yǔ)句
3. 在語(yǔ)句里,第二個(gè)set語(yǔ)句產(chǎn)生另一個(gè)數(shù)據(jù)指針,該指針將指向表bonus_criteria的第一條觀測(cè)
然后執(zhí)行end語(yǔ)句,并返回Do語(yǔ)句
4. 再次判斷while語(yǔ)句,not( 0 le 200 le 500 ) 為假,跳出Do while循環(huán),執(zhí)行后面的語(yǔ)句bonus=salary * factor; 并output到bonus的第一條觀測(cè)。
Name | Salary | Amount | Low | High | Factor | Bonus |
Jim | 500 | 200 | 0 | 500 | 0.1 | 50 |
5. 返回data步開(kāi)頭,PDV清空sale_amount中的所有變量值,但不會(huì)清空bonus_criteria中的值,因?yàn)楸韇onus_criteria的指針仍然停留在第一條觀測(cè)上,且程序還未執(zhí)行到第二個(gè)set語(yǔ)句。
6. 讀取sale_amount的第二條數(shù)據(jù)
Name | Salary | Amount |
Tom | 1000 | 700 |
進(jìn)入Do循環(huán),判斷while語(yǔ)句,由于未執(zhí)行到下一個(gè)set語(yǔ)句,bonus_critera的所有變量不被清空,0 le 700 le 500為假, not ( 0 le 200 le 500) 為真,執(zhí)行Do語(yǔ)句。
7.再第二個(gè)set執(zhí)行前,清空PDV中關(guān)于Bonus_criteria中的所有變量,第二指針指到bonus_criteria的第二條觀測(cè)
執(zhí)行END語(yǔ)句,返回Do語(yǔ)句
8. 判斷while語(yǔ)句not( 501 le 700 le 1000) 為假,跳過(guò)Do循環(huán),執(zhí)行bonus=salary * factor; 并output到bonus的第二條觀測(cè)。
Name | Salary | Amount | Low | High | Factor | Bonus |
Jim | 500 | 200 | 0 | 500 | 0.1 | 50 |
Tom | 1000 | 700 | 501 | 1000 | 0.2 | 200 |
7.跳到data步開(kāi)始,清空PDV中sale_amount的變量值,讀取sale_amount第三條觀測(cè)
Name | Salary | Amount |
Lily | 2000 | 1500 |
判斷while語(yǔ)句,not( 501le 1500 le 1000) 為真,執(zhí)行Do語(yǔ)句,清空PDV中bonus_criteria的變量值,讀取bonus_criteria的第三條觀測(cè)
Low | High | Factor |
1001 | 2000 | 0.4 |
執(zhí)行END語(yǔ)句,返回Do語(yǔ)句,判斷while語(yǔ)句 not( 1001 le 1500 le 2000)為假,跳過(guò)Do語(yǔ)句,執(zhí)行bonus=salary * factor; 并output到bonus的三條觀測(cè)。
Name | Salary | Amount | Low | High | Factor | Bonus |
Jim | 500 | 200 | 0 | 500 | 0.1 | 50 |
Tom | 1000 | 700 | 501 | 1000 | 0.2 | 200 |
Lily | 2000 | 1500 | 1001 | 2000 | 0.4 | 800 |
8.返回data步開(kāi)始, PDV清空sale_amount中的所有變量值,讀取sale_amount的第四條數(shù)據(jù)
Name | Salary | Amount |
Saly | 700 | 300 |
進(jìn)入Do語(yǔ)句,判斷while 語(yǔ)句,not(1001 le 300 le2000) 為真,執(zhí)行Do語(yǔ)句,清空PDV中bonus_criteria的變量值,讀取bonus_criteria的第四條觀測(cè)
Low | High | Factor |
2001 | 5000 | 0.6 |
執(zhí)行end語(yǔ)句,返回do語(yǔ)句,再次判斷while語(yǔ)句
注意:此時(shí)會(huì)一直陷入Do的循環(huán),因?yàn)閘ow和high越來(lái)越大,sale_amount的第四條數(shù)據(jù)的amount=300,not(low le amount le high) 從此一直為真。在讀取sale_amount的最后一條觀測(cè)后,由于sale_amount無(wú)數(shù)據(jù)可讀,所以sas會(huì)跳轉(zhuǎn)到下一個(gè)data步或者proc步等。于是會(huì)產(chǎn)生
sale_amount中讀取4條記錄(第四條記錄讀取并進(jìn)入循環(huán)但最終都沒(méi)有被output)
bonus_criteria中讀取5條全部記錄(后面一直在循環(huán),并且data步終止也是因?yàn)閿?shù)據(jù)讀完)
bonus觀測(cè)中含有3條數(shù)據(jù)。