0

我有截至今天的 ID 和 ID 更改的历史记录。我想知道 ID 最近的 ID 是什么,以及在某些指定的历史截止日期与之关联的所有 ID;并计算 ID 更改的次数。

以下代码为“Want”数据集生成结果,但随着时间的推移它不正确。

data have;
attrib OldID NewID length=8 ChangeDate informat=mmddyy10. format=mmddyy10.;
 input OldID NewID ChangeDate;
 datalines;
 4 .  8/1/10
 12 . 8/1/10
 11 12 8/1/10
 3 4 7/10/10
2 3 7/1/10
 1 2 1/1/10
 10 11 1/1/10
;
 data want(keep=asof origID currID changeCount);
 attrib asof format=mmddyy10. origID currID length=8;

 declare hash roots();
 roots.defineKey('OldID'); 
roots.defineData('OldID', 'ChangeDate'); 
roots.defineDone();

declare hash changes(); 
changes.defineKey('NewID');
 changes.defineData('OldID', 'ChangeDate'); 
changes.defineDone();

 do while (not done);
 set have end=done;
 if missing(NewID) then roots.add();
 else changes.add(); 
end;
array asofs (7) _temporary_ (

 '15-MAR-2010'd
 '02-JUL-2010'd
 '15-JUL-2010'd
 '15-AUG-2010'd
 );
 declare hiter hi('roots');

 do index = 1 to dim(asofs);
 asof = asofs(index); 

do while (hi.next() eq 0);
 origID = OldID; 
currID = .;

 do changeCount = 0 by 1 while (ChangeDate <= asof);
 currID = OldID;
 if changes.find(key:OldID) ne 0 then leave;
 End;

 output; 
end; 
end; 
stop; 
run;

数据集 Want 如下所示:

作为 原始ID 当前 ID 变化计数
2010 年 3 月 15 日 12 11 2
2010 年 3 月 15 日 4 2 3
2010 年 7 月 2 日 12 11 2
2010 年 7 月 2 日 4 3 2
2010 年 7 月 15 日 12 11 2
2010 年 7 月 15 日 4 4 1
2010 年 8 月 15 日 12 . 0
2010 年 8 月 15 日 4 . 0
. 12 10 2
. 4 1 3
. 12 10 2
. 4 1 3
. 12 10 2
. 4 1 3

我想要数据集想要看起来像这样:

作为 原始ID 当前 ID 变化计数
2010 年 3 月 15 日 4 2 1
2010 年 3 月 15 日 12 11 1
2010 年 7 月 2 日 4 3 2
2010 年 7 月 2 日 12 11 1
2010 年 7 月 15 日 4 4 3
2010 年 7 月 15 日 12 11 1
2010 年 8 月 15 日 4 4 3
2010 年 8 月 15 日 12 12 2
4

1 回答 1

0

所以,你需要反省。这似乎与您想要的有关,尽管您必须添加一些代码来处理最后 2 行 - 8/15 日期您的最后日期之后。我想你可以很容易地处理它。

data want(keep=asof origID currID changeCount);
    attrib asof format=mmddyy10. origID currID length=8;

    declare hash roots();
    roots.defineKey('OldID'); 
    roots.defineData('OldID', 'ChangeDate'); 
    roots.defineDone();

    declare hash changes(); 
    changes.defineKey('NewID');
    changes.defineData('OldID', 'ChangeDate'); 
    changes.defineDone();

    do while (not done);
        set have end=done;
        if missing(NewID) then roots.add();
        else changes.add(); 
    end;
    array asofs (7) _temporary_ (

     '15-MAR-2010'd
     '02-JUL-2010'd
     '15-JUL-2010'd
     '15-AUG-2010'd
    );
 declare hiter hi('roots');

 *add code to deal with asofs dimensions not equal to actual contents;
 do index = 1 to dim(asofs) while (asofs[index] ne .);
     asof = asofs(index); 
    
    do while (hi.next() eq 0);
        origID = OldID; 
        currID = .;
        
         *start at -1 instead of 0 because it always increments 1x too many;
         *And, look while changedate is GREATER than, bc you are coming from the larger end;
         do changeCount = -1 by 1 while (changeDate > asof);
             currID = OldID;
             if changes.find(key:OldID) ne 0 then leave;
         End;

         output; 
    end; 
 end; 
 stop; 
run;
于 2021-06-24T20:00:36.133 回答