2013-08-01 58 views
1

,我有以下數據:獲取變量的最新變化

data have; 
    input username $ betdate : datetime. customerCode; 
    dateOnly = datepart(betdate) ; 
    format betdate DATETIME.; 
    format dateOnly ddmmyy8.; 
    datalines; 
    player1 12NOV2008:12:04:01 1 
    player1 04NOV2008:09:03:44 10 
    player2 07NOV2008:07:03:33 1 
    player2 05NOV2008:09:00:00 0.5 
    player3 05NOV2008:09:05:00 1 
    player2 07NOV2008:14:03:33 1 
    player1 05NOV2008:09:00:05 20 
    player2 07NOV2008:16:03:33 1 
    player2 07NOV2008:18:03:33 1 
    player2 09NOV2008:10:05:10 0.7 
    player3 15NOV2008:15:05:33 10 
    player3 15NOV2008:15:05:33 1 
    player2 15NOV2008:15:05:33 0.1 
run; 
PROC PRINT; RUN; 

我如何運行「PROC SQL」命令來拉出每個球員的最新(即不同(customerCode)與最新日期(即:max(betdate))和每位玩家最早(通過betdate再次更新)customerCode的更新?這是一個動態變量,會不時變化嗎?我是否必須爲每個用戶名運行一個子選擇符, betdate)和客戶代碼從表中獲得?

謝謝。

+0

新增SQL標記,以便您可以從SQL專家 – Joe

回答

1

PROC SQL並不是最簡單的方法,但它確實有可能。

proc sql; 
select H.username, H.customercode from have H inner join (
    select username, max(betdate) as maxdate from have group by username 
) V 
on H.username=V.username and H.betdate=V.maxdate; 
quit; 

這將返回Player3的兩個值,您將不得不解決如何解決關係。數據步驟要容易得多,最多隻需要一次排序和一次遍歷(在散列中甚至更快,或者在IML矩陣中)。

+0

這工作正常獲得更好的響應。對於上面player3的重複betdate的觀察是我的一個錯字,所以我改變了它。我試圖用subselect而不是innerjoin來複制你的代碼,如下所示,因爲這樣可以更容易地爲customerCode提取第一個和最後一個值,但它不會評估爲每個玩家單獨的一行! 'proc sql; select H.username,(從V中選擇V.customercode,其中V.username = H.username和V.betdate = \t(從X中選擇max(X.betdate),其中X.username = H.username)) 從H組通過用戶名; quit;' – user2146441

+0

正如我所指出的那樣,如果您有聯繫,那麼這不會解決爲一個 - 您需要找出解決方法。 – Joe

1

您可以使用稱爲聚合的proc sql功能與「重新合併」。下面的查詢通過用戶名輸出與最大日期的每一行:

proc sql; 
select H.username, H.customercode, date, max(date) as maxdate 
from have H 
group by H.username 
quit; 

然後可以把這個在子查詢中得到你想要的值:

proc sql; 
select username, customercode, date 
from (select H.username, H.customercode, date, max(date) as maxdate 
     from have h 
     group by H.username 
    ) h 
where date = maxdate; 
quit; 

下也可以工作,但我沒有手頭上的SAS來測試我現在所在:

proc sql; 
    select H.username, H.customercode, date 
    from have H 
    group by H.username 
    having date = max(date) 
quit; 
+0

一個音符 - 重新合併基本上只有SAS,我不知道任何其他的SQL風格,這將允許你得到這個自動合併(或允許你選擇不在組合或聚合函數中的東西)。 – Joe

+0

@Joe。 。 。你的聲明的第一部分是真實的(這是'proc sql'和其他SQL方言之間的許多區別之一)。第二部分是不正確的。 MySQL支持不在'group by'子句中的列,就像某些版本的Postgres一樣。這個功能甚至與更新版本的ANSI標準一致(儘管結果與'proc SQL'產生的結果大不相同)。 –

+0

那麼,我只知道/使用SQL Server和Oracle,所以它技術上是真的;)謝謝澄清,但。 – Joe