表old
:
date
05DEC2016 a
28NOV2016 b
22DEC2016 c
23JAN2017 d
12JAN2017 e
09JAN2017 f
25DEC2016 g
我需要创建一个新表:
data new;
set old;
****the right code***
run;
这样,new
包含具有最新日期的行。
所以new
是:
23JAN2017 d
我首先尝试找到最新日期:latest_date = max(date)
,然后使用简单的where=
,但正如您所见 - 这不起作用
答案 0 :(得分:4)
SQL是最简单的方法。数据步骤中的max
函数不能跨行工作(因为数据步骤中没有函数);它会给你最多的列数。在数据步骤中,您还可以转置,使用哈希,或者只使用跨行保留已保存的值并进行比较;但是SQL非常简单,使用having
。
data have;
format date date9.;
input date :date9. code :$1.;
datalines;
05DEC2016 a
28NOV2016 b
22DEC2016 c
23JAN2017 d
12JAN2017 e
09JAN2017 f
25DEC2016 g
;;;;
run;
proc sql;
select date, code
from have
having date=max(date);
quit;
要以最简单的方式在数据步骤中执行,但必须使用retain
,这些内容如下:
data want;
set have end=eof;
retain max_Date max_code;
if date > max_date then do;
max_date = date;
max_code = code;
end;
if eof then output;
format max_date date9.;
rename
max_date=date
max_code=code
;
keep max_date max_code;
run;
最后,真正最简单的方法就是使用idgroup
option in proc means
。
proc means data=have;
var date;
output out=want
idgroup(max(date) /* asks for the row with the maximum date */
out[1] /* asks for the 1 maximum date - could get more */
(date code)= /* asks for these two variables to be output */
);
run;
答案 1 :(得分:0)
另一种方法是对数据进行排序,使最大的数据最终位于数据的顶部,然后进行第一次观察。这种方法的好处 - 它非常容易理解和编码。缺点是对大型数据集进行排序会占用大量时间/内存。
data have;
format date date9.;
input date :date9. code :$1.;
datalines;
05DEC2016 a
28NOV2016 b
22DEC2016 c
23JAN2017 d
12JAN2017 e
09JAN2017 f
25DEC2016 g
;;;;
run;
proc sort data=have;
by descending date;
run;
data want;
set have (obs=1);
run;