2016-09-12 63 views
1

只是好奇,是這樣的代碼:確實如果datastep檢查語句缺失值

data Bla.SomeGreatNewDataset; 
    set WORK.InputTempDataset; 
    by SomeColumnName; 
    if first.SomeColumnName then output; 
    else delete; 
run; 

一樣:

data Bla.SomeGreatNewDataset; 
    set WORK.InputTempDataset; 
    by SomeColumnName; 
    if not missing(first.SomeColumnName) then output; 
    else delete; 
run; 

換句話說作用:

if first.SomeColumnName 

只是檢查如果SomeColumnName不包含缺少的值?

回答

1

簡短的回答,沒有。

BY組處理first.varlast.var對變量的不同值進行操作。缺少的值是有效的缺失值。

first.varlast.var是布爾值,可以是1或0.您爲每個唯一值SomeColumnName編碼輸出只是第一條記錄。

請注意,數據需要按SomeColumnName排序,或者在該列上有索引。

下面是一個例子:

data have; 
input x; 
datalines; 
1 
2 
2 
. 
3 
3 
3 
; 
run; 

proc sort data=have; 
by x; 
run; 

data want; 
set have; 
by x; 
if first.x; 
run; 

proc print data=want; 
run; 

產地:

          Obs x 

              1  . 
              2  1 
              3  2 
              4  3 
+0

好感謝所以它似乎像SQL中的TOP 1 GROUP BY?我仍然不確定該行:else delete;何時會發生? – cs0815

+0

這在SQL語句上是正確的。 '然後輸出;否則刪除;'作品相同'子集如果「我有。將我所擁有的替換掉,你會得到相同的結果。 – DomPazz

+1

'else delete'有完整性和理解性。沒有它的輸出將是完全相同的 – Longfish