1. 條件語句where和if的區(qū)別 從上圖可以看出,where在原始數據進入PDV(program data vector)前對數據進行判斷,是否滿足條件,滿足的條件的觀測值進入PDV,不滿足的則排除,PDV簡單的說就是在編譯過程中用于存儲新建數據集變量值的空間。而if是將原始數據集中的所有值放入PDV后進行條件判斷,滿足條件的輸出到新建數據集中。因此使用where條件篩選速度快于if。where只能從現有的sas數據集中選擇觀測,if語句還可以用input語句產生的觀測中選。Where可以作為選項進行應用。 運行速度比較: 結果比較: if條件語句首先是把sashelp邏輯庫的class數據集前5個觀測對象放入PDV,對滿足年齡大于13歲的對象輸出到新建數據集;而where是數據放入PDV前逐一進行判斷,滿足條件的前5個觀測對象放入PDV,輸出。所以if輸出的觀測對象個數時小于或等于obs指定值,而where是等于obs指定值。 If和where關鍵不同點匯總: 2. select和if 當被判斷變量為數值型變量,select處理效率高于if,而當變量為字符型時if條件判斷效率較高。兩者使用選擇: 選擇if: a. 變量為字符型; b. 變量值不均勻分布; c. 較少判斷條件。 選擇select: a. 數據規(guī)整分布; b. 變量為數值型且條件間互斥,即判斷條件間無交集; 總得來說條件間互斥的數值型變量或條件較多時選擇select;其他if。且在數據量很大時兩者的效率才能凸顯。 data test_select; set sashelp.class; select; when (age le 12) age_group='low-12'; when (age le 15) age_group='13-15'; when (age ge 16) age_group='16-high'; otherwise; end; run; 3.sql里where和having的區(qū)別 sas sql里where和having條件的選擇規(guī)則類似于sas data set新建if和where的區(qū)別,having是對sql語句中groupby分割后的亞組數據集進行條件篩選,先按亞組計算將計算結果新變量放入新建表(tables)中,在按照having指定條件對亞組進行篩選;因此having需在group by語句后,而where是對整個數據集進行篩選,先篩選出符合條件的觀測對象,再按照group by分割的亞組進行計算,產生的新變量再放入新建表中,where語句需在group by之前;而當無groupby語句時having的作用相當于where; /*having*/ proc sql noprint; create table data_having as select *,avg(age) as avgage from sashelp.class group by sex having age ge 15; quit; /*where*/ proc sql noprint; create table data_where as select *,avg(age) as avgage from sashelp.class where age ge 15 group by sex; quit; 結果差異: 兩者的主要差異: |
|