SAS数据步骤 - 在当前数据集中,循环访问另一个数据集以获取值

时间:2014-10-16 06:25:03

标签: sas datastep

我有2个像这样的数据集

数据集1:

From       To           Period
01/1/2000  20/1/2000    1
21/1/2000  14/2/2000    2
15/2/2000  31/3/2000    3

数据集2:

Date
15/1/2000
13/2/2000
20/3/2000

理想的结果是这样的:

Date        Period
15/1/2000   1
13/2/2000   2
20/3/2000   3

我认为这个解决方案是通过每条记录遍历数据集2,查找并比较数据集2的日期值和数据集1中的To To范围,直到找到匹配,然后获取Period值。我们能用SAS datastep代码而不是sql来做到这一点吗?如果我们这样做,表现明智,它会更好吗?

感谢您的帮助,非常感谢。

2 个答案:

答案 0 :(得分:1)

从查找数据集创建信息是这里的方法。然后使用信息来使用INPUT函数创建值。

data ds1;
input From :ddmmyy10.  To :ddmmyy10. Period;
format From :ddmmyy10.  To :ddmmyy10.;
datalines;
01/1/2000  20/1/2000    1
21/1/2000  14/2/2000    2
15/2/2000  31/3/2000    3
;
run;

data ds2;
input date :ddmmyy10.;
format date ddmmyy10.;
datalines;
15/1/2000
13/2/2000
20/3/2000
;
run;

/* create dataset with informat details*/
data ds1_fmt;
set ds1;
rename from=start to=end period=label;
retain fmtname 'dt_fmt' type 'I';
run;

/* create informat from dataset */
proc format cntlin=ds1_fmt;
run;

/* create output dataset */
data want;
set ds2;
period=input(date,dt_fmt.);
run;

答案 1 :(得分:0)

data lookup;
INFILE DATALINES;
input @1 from mmddyy10. @12 to mmddyy10. @22 period $;
datalines;                      
01/01/2000 01/20/2000 1
01/21/2000 02/14/2000 2
02/15/2000 03/31/2000 3
;
data base;
infile datalines; 
input @1 date mmddyy10.;
datalines;
01/15/2000
02/13/2000
03/20/2000
;

尝试使用proc sql

proc sql;
create table result as
select put(b.date,mmddyy10.), (select max(period) from lookup l where b.date between l.from and l.to) as period
from base b;
quit;