如何在新列中保留最新值

时间:2019-04-17 22:55:04

标签: sas

SAS帮助:我有一个下表如下:我希望impdate列中的最新值填充到id1的dataIwant列中。 id2只是为了表明id1可以与创建多个行的多个id2相关。

我尝试按id1,日期对数据进行排序,然后使用不起作用的keep语句。

data want;
date have;
by id1 date;
retain dataiwant;
if impdate then do;
dataiwant = impdate;
end;
else do;
if missing(impdate) then do;
impdate = dataiwant;
end;date    id1 id2 impdate

我拥有的数据:

date        id1 id2 impdate
31Dec2018   1   7A  31Aug2017
31Dec2018   1   8A  31Aug2017
31Dec2018   1   9A  31Aug2017
31Jan2019   1   7A  31Aug2017
31Jan2019   1   8A  31Aug2017
31Jan2019   1   9A  31Aug2017
28Feb2019   1   7A  1Mar2019
28Feb2019   1   8A  1Mar2019
28Feb2019   1   9A  1Mar2019
31Dec2018   2   81A 9Sep2018
31Dec2018   2   82B 9Sep2018
31Jan2019   2   81A 9Sep2018
31Jan2019   2   82B 9Sep2018
28Feb2019   2   81A 1Feb2019
28Feb2019   2   82B 1Feb2019
31Jan2019   3   66A .
31Jan2019   3   66B .
28Feb2019   3   66A .
28Feb2019   3   66B .

我想要的数据:

date        id1 id2 impdate     DataIwant
31Dec2018   1   7A  31Aug2017   1Mar2019
31Dec2018   1   8A  31Aug2017   1Mar2019
31Dec2018   1   9A  31Aug2017   1Mar2019
31Jan2019   1   7A  31Aug2017   1Mar2019
31Jan2019   1   8A  31Aug2017   1Mar2019
31Jan2019   1   9A  31Aug2017   1Mar2019
28Feb2019   1   7A  1Mar2019    1Mar2019
28Feb2019   1   8A  1Mar2019    1Mar2019
28Feb2019   1   9A  1Mar2019    1Mar2019
31Dec2018   2   81A 9Sep2018    1Feb2019
31Dec2018   2   82B 9Sep2018    1Feb2019
31Jan2019   2   81A 9Sep2018    1Feb2019
31Jan2019   2   82B 9Sep2018    1Feb2019
28Feb2019   2   81A 1Feb2019    1Feb2019
28Feb2019   2   82B 1Feb2019    1Feb2019
31Jan2019   3   66A .   .
31Jan2019   3   66B .   .
28Feb2019   3   66A .   .
28Feb2019   3   66B .   .

1 个答案:

答案 0 :(得分:0)

这应该是基于id1列的具有相同表的简单联接

data have;
input date date9. id1 id2$ impdate date9.;
format date impdate date9.;
datalines;
31Dec2018 1 7A 31Aug2017 
31Dec2018 1 8A 31Aug2017 
31Dec2018 1 9A 31Aug2017 
31Jan2019 1 7A 31Aug2017 
31Jan2019 1 8A 31Aug2017 
31Jan2019 1 9A 31Aug2017 
28Feb2019 1 7A 1Mar2019 
28Feb2019 1 8A 1Mar2019 
28Feb2019 1 9A 1Mar2019 
31Dec2018 2 81A 9Sep2018 
31Dec2018 2 82B 9Sep2018 
31Jan2019 2 81A 9Sep2018 
31Jan2019 2 82B 9Sep2018 
28Feb2019 2 81A 1Feb2019 
28Feb2019 2 82B 1Feb2019 
31Jan2019 3 66A . 
31Jan2019 3 66B . 
28Feb2019 3 66A . 
28Feb2019 3 66B .
;
run;

proc sql;
select a.*,b.dateiwant
from have a
left join (select id1,
                  max(impdate) as dateiwant format=date9.
             from have 
             group by id1) b
on a.id1=b.id1;
quit;