2014-12-05 108 views
1

我在SAS以下代碼:SAS:如何正確地使用intck()在PROC SQL

proc sql; create table play2 as select a.anndats,a.amaskcd,count(b.amaskcd) as experience from test1 as a, test1 as b where a.amaskcd = b.amaskcd and intck('day', b.anndats, a.anndats)>0 group by a.amaskcd, a.ANNDATS; quit;

數據TEST1具有32個不同的觀測值,而此play2僅返回22個OBS。我想要做的就是爲每個obs計算曆史中相同amaskcd的外觀數量。解決這個問題的最好方法是什麼?謝謝。

回答

0

這將返回22個觀察值的原因 - 它實際上可能不是32個不同於32的 - 是這是一個逗號連接,在這種情況下最終基本上是一個內部連接。對於任何給定的行a,如果沒有行b,其後面的anndatsamaskcd相同,則不會返回那個a

你想要在這裏做的是一個左連接,它返回來自a的所有行一次。

create table play2 
    as select ... 
    from test1 a 
    left join test1 b 
    on a.amaskcd=b.amaskcd 
    where intck(...)>0 
    group by ... 
; 

我實際上會寫這個不同的,因爲我不知道上述將完全做你想要的。

create table play2 
    as select a.anndats, a.amaskcd, 
    (select count(1) from test1 b 
     where b.amaskcd=a.amaskcd 
     and b.anndats>a.anndats /* intck('day') is pointless, dates are stored as integer days */ 
    ) as experience 
    from test1 a 
    ; 

如果你的test1還沒有被amaskcd和anndats分組,你可能需要重新做一些。我懷疑,這種子查詢更容易編寫,並且更準確地反映了你想要做的事情。

0

如果每個數據集中的anndats變量都是日期類型(不是日期時間),那麼您可以簡單地做一個等於。 SAS中的日期變量只是整數,其中1表示一天。你不需要使用intck函數來告訴天差異,只需使用減法。

我注意到的第二件事是您的代碼查找> 0天返回。如果第二個值小於第一個,則intck函數可以返回負值。

我仍然不確定我是否理解你在查詢中產生的內容。它使用amaskcd字段作爲關鍵連接兩個數據集。然後根據anndats進行篩選,只選擇b anndats值小於a anats或b.anndats a.anndats的記錄。