1

最初の3列のようなテーブルがあり、4番目の列を追加する必要があります。

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は、SASSQLを含むほとんどの方言で機能します。

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(存在する場合)を持つ次のステータスレコードを検索し、結果を結合してステータスを取得します。

data stepSASでは、この使用コードを実行する傾向があります。データが特定のデータベースに保存されている場合は、データベースに固有のより単純なソリューションが存在する可能性があります。

于 2013-03-25T14:29:39.167 に答える
2

これがあなたdata stepが望むことをするべきコードです。である必要があることを示す行がこれ以上ないため、最終行は正しく実行されませんOpen。適用できるデータロジックルールがある場合は、簡単に追加できるはずです。

2種類が必要であり、コストがかかる可能性がありますが、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 に答える