2013-03-25 226 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