我有截至今天的 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 |