2013-03-25 64 views
1

我有這樣一日3列的表,並需要添加第四列:與以下行詳細信息回填

Sequence ID Last Status Current Status 
1  1    New 
2  1 New   Open  
3  1    Open 
4  1    Open 
5  1    Open 
6  1 Open   Closed 
7  1    Closed 
8  1    Closed 
9  1 Closed  
10  2    New 
11  2 New   Open 
12  2    Open 
13  2 Open   Closed 
14  2 Closed  
15  3    New 
16  3 New   Open 
etc.  

基本上它目前只顯示該點的最後狀態的狀態被改變 - 我需要顯示當前的'當前'狀態。

我是新來的SQL,並認爲我可以使用LEAD,但不幸的是它在SAS中不受支持。

謝謝!

回答

2

這是data step代碼應該做你想做的。它不會正確地執行最後一行,因爲您沒有任何其他行來表明它應該是Open。如果有可應用的數據邏輯規則,則應該很容易添加。

它確實需要兩種,這可能很昂貴,但可能SQL Join會在幕後需要類似的操作。如果您有大量數據,我建議您測試兩種方法以查看哪種方法更快。

data have; 
input Sequence ID LastStatus $; 
infile datalines missover; 
datalines; 
1  1    
2  1 New   
3  1    
4  1    
5  1    
6  1 Open   
7  1    
8  1    
9  1 Closed  
10  2    
11  2 New   
12  2    
13  2 Open   
14  2 Closed  
15  3    
16  3 New   
;;;; 
run; 

proc sort data=have; 
by id descending sequence; 
run; 

data want; 
set have; 
length CurrentStatus $8; 
by id descending sequence;  *so the last sequence for each ID comes first; 
retain CurrentStatus;   *keep its value for each row; 
if first.id then 
call missing(CurrentStatus); *reset for each ID; 
output;       *put out the current line; 
if not missing(LastStatus) then 
    CurrentStatus = LastStatus; *now update CurrentStatus if needed; 
run; 

proc sort data=want;    *resort in logical order; 
by id sequence; 
run; 
+1

謝謝。我發現過去類似的事情更快地發現數據步驟,而且我無法得到SQL來運行。 – 2013-03-26 12:47:20

+0

您可能可以消除2種類型,並通過向後處理數據集在單個數據步驟中執行此操作: http://stackoverflow.com/questions/915419/sas-can-i-make-sas-process-觀察結果向後 我不確定這是否可以與通過聲明一起工作,但是值得一試。 – user667489 2013-03-26 14:32:22

+0

不幸的是,沒有;當使用隨機訪問(POINT)時,你會失去LAST和FIRST。如果DESCENDING的工作方式允許您從同一類別進行升級或降級,那將會很好,但這很難或不可能實現。 – Joe 2013-03-27 06:56:05

2

下面的SQL將在大多數方言,包括SAS SQL工作:

select t.quence, t.id, t.lastStatus, tnext.lastStatus as CurrentStatus 
from (select t.*, 
      (select min(Sequence) from t t2 where t2.id = t.id and t2.sequence > t.sequence and t2.LastStatus is not null 
      ) as NextId 
     from t 
    ) t left out join 
    t tnext 
    on t.sequence = tnext.sequence 

它找到具有相同id的下一個狀態記錄(如果有的話),然後再在加入結果得到的狀態。

在SAS中,我會更傾向於使用data step這個代碼。如果數據存儲在特定的數據庫中,則可能會有更簡單的針對數據庫的解決方案。

+0

不幸的是我無法得到這個工作。我確信這只是我,所以我會再試一次。謝謝你的幫助。 – 2013-03-26 12:45:43