0

我有 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 中的范围 From To 进行比较,直到找到匹配项,然后获取 Period 值。我们可以用 SAS 数据步代码而不是 sql 来做到这一点吗?如果我们这样做,性能明智,会更好吗?

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

4

2 回答 2

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;
于 2014-10-16T09:55:36.317 回答
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;
于 2014-10-16T09:12:06.857 回答