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 不支持它。

谢谢!

4

2 回答 2

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代码。如果数据存储在特定数据库中,则可能存在特定于该数据库的更简单的解决方案。

于 2013-03-25T14:29:39.167 回答
2

data step是应该做你想做的代码。它没有正确地完成最后一行,因为您没有任何其他行来表明它应该是Open. 如果有可以应用的数据逻辑规则,那应该很容易添加。

它确实需要两种类型,这可能很昂贵,但 SQL 连接可能需要在幕后进行类似的操作。如果您有大量数据,我建议您测试这两种方法,看看哪种方法更快。

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;
于 2013-03-25T16:56:26.417 回答