WHERE 語句冷知識
前幾天,我在一篇文章中看到這樣的說法:
數(shù)據(jù)步中的 WHERE 語句可以有三種寫法:
①作為輸入數(shù)據(jù)集的 WHERE= 選項;
②作為輸出數(shù)據(jù)集的 WHERE= 選項;
③作為單獨的 WHERE 語句;
三者的運行速度的快慢關(guān)系為:①最快,②次之,③最慢。
閱讀到這里時,我產(chǎn)生了疑問,方式①和方式③都是直接應(yīng)用于輸入數(shù)據(jù)集,運行速度怎么會不一樣呢?我打算進行實驗,一探究竟。通過編寫SAS程序,我生成了一個包含超過一千萬條服從0到1之間均勻分布的隨機數(shù)據(jù)的數(shù)據(jù)集,然后用三種不同位置的 WHERE 條件篩選出大于0.5的數(shù)據(jù)。我編寫了一個簡單的程序,它將3種方式各自運行30遍,然后計算3種方式的運行時間和、均值和中位數(shù),最后,我還將實驗過程錄制成了視頻。

實驗結(jié)果顯示,三者的運行速度應(yīng)該是:①≈③,②最慢??磥恚@得真正的知識,非得要親身實踐不可。
通過查詢軟件手冊,以及自身多年的工作經(jīng)驗,我還總結(jié)了以下關(guān)于 WHERE 語句的冷知識:
1. 聯(lián)合使用 WHERE 語句和 WHERE= 選項
1.1 數(shù)據(jù)步中,WHERE=選項應(yīng)用到單獨的數(shù)據(jù)集,WHERE 語句應(yīng)用到所有未指定WHERE=選項的數(shù)據(jù)集;
1.2 過程步中,WHERE= 選項和 WHERE 語句指定的表達式會以 and 邏輯進行連接,組合成新的 WHERE 表達式,應(yīng)用到輸入數(shù)據(jù)集;


2. WHERE 語句的使用限制
2.1?在DATA步中,讀取 DATALINES或CARDS語句指定的數(shù)據(jù)行時,不可以使用 WHERE 語句;
2.2?在DATA步中,讀取 INFILE 語句指定的外部數(shù)據(jù)文件時,不可以使用 WHERE 語句;
2.3?當在 SET 或 MODIFY 語句中指定 POINT= 選項時,不可以使用 WHERE 語句;



3. WHERE 語句的使用便利
3.1?WHERE 語句允許單獨使用一個數(shù)值型變量作為表達式,此時,數(shù)值0或缺失值為假,其它值為真;
3.2?WHERE 語句允許單獨使用一個字符型變量作為表達式,此時,缺失值為假,其它值為真;

4. 擴充 WHERE 子句
可以使用 WHERE SAME AND 或 WHERE ALSO 語句對前述 WHERE 語句進行擴充,這在語義上等價于在一個 WHERE 語句中用 and 運算符連接多個表達式,但是在編寫和維護方面更具優(yōu)勢。

5. 未記錄的功能
在 SAS 中有未記錄在軟件手冊中的函數(shù) monotonic(),它可以返回當前觀測的行號。當想通過 WHERE 語句篩選觀測行號時,不可以使用自動變量_N_(因為該變量衍生于PDV中,而WHERE語句在PDV之前篩選數(shù)據(jù)),但卻可以使用 monotonic() 函數(shù)。

以上幾點中,我最常用到的是第3和第4點,也希望這些知識能給正在閱讀的你帶來幫助。