问题出在SAS 9.1.3下,有两个数据集:A和B.
Set A是包含日期和名称的主要数据集。
data Aa;
input date name $ ;
datalines;
20120102 A
20110102 B
20120102 C
20110102 A
20120102 B
20110102 C
;
Set B包含我要合并的数据以设置A.
data B;
input date name $ rate;
datalines;
20120101 A 0.01
20120101 B 0.02
20120101 C 0.03
20110101 A -0.01
20110101 B -0.02
20110101 C -0.03
;
我知道SAS proc sql中没有提取xxx行,因此我在行集B中添加了行计数:
proc sort data = b; by descending date name ;run;
data b1;
set b;
ind = _n_;
run;
我想要做的是将B中的最新费率合并为A.而我的proc sql是这样的:
proc sql;
create table new as
select a.*,b.rate
from Aa a left join b1 b
on a.name = b.name and a.date>=b.date
group by b.ind having min(b.ind)=b.ind;
quit;
但我的结果是这样的:
20110102 A .
20110102 B .
20110102 C .
20120102 A -0.01
20120102 B -0.02
20120102 C -0.03
预期结果是:
20110102 A -0.01
20110102 B -0.02
20110102 C -0.03
20120102 A 0.01
20120102 B 0.02
20120102 C 0.03
答案 0 :(得分:1)
您不需要向B添加行计数器,无论如何您不会进行并排合并。
我认为这有效(我将Aa重命名为A):
proc sql;
create table C as
select _A.date, _A.name, b.rate from (
select date, name, max(b_date) as b_date from (
select a.*, b.rate, b.date as b_date from a
left join b
on a.name = b.name
and a.date gt b.date)
group by name, date) _A
left join b
on _A.name=b.name
and _A.b_Date=b.date;
quit;
基本概念首先构建笛卡尔连接,即所有可能行的连接,其中A.date> B.date,然后根据日期差异最小的行过滤,以确定哪个行/日期具有您需要的速率。然后加入B表以获得费率本身。