我需要合并帮助。我有两个表如下- 表1
ID ID1 ID2 ID3 ID4 ID5
1005 2005 3005 4005 5005 7105
3005 4005 5005 7105
4005 5005 7105
5005 7105
2005 3005 4005 5005 7105
7105
表2
ID Names
1005 John
3005 Rick
4005 Sam
5005 Harry
2005 Mary
7105 Deena
我需要一种有效的方法来与表1和表2中的列合并。我可以在单独的数据步骤中进行合并,但是有没有一种方法可以以更有效的方式来完成呢?
proc sql;
create merge1 as
select *
from table1 a
left join table2 b on a.id = b.id;
quit;
proc sql;
create merge2 as
select *
from merge1 a
left join table2 b on a.id = b.id;
quit;
我想要所有列的结果(下面的示例):
ID NamesID ID1 NamesID1 ID2 NamesID2 ID3
1005 John 2005 Mary 3005 Rick 4005
3005 Rick 4005 Sam 5005 Harry 7105
4005 Sam 5005 Harry 7105 Deena
5005 Harry 7105 Deena
2005 Mary 3005 Rick 4005 Sam 5005
7105 Deena
谢谢!
答案 0 :(得分:1)
这是基于格式的解决方案:
(hv_sub.netValue /
NULLIF(LAG(hv_sub.curValue, 1) OVER (PARTITION BY hv_sub.portfolio ORDER BY hv_sub.price_date), 0)
) AS portfolio_retrn_pct
这对于大型输入将非常有效,因为它不需要多种排序。当然,通常,通常应将输入数据集data table1;
length id id1 id2 id3 id4 id5 8;
infile datalines missover;
input id id1 id2 id3 id4 id5;
cards;
1005 2005 3005 4005 5005 7105
3005 4005 5005 7105
4005 5005 7105
5005 7105
2005 3005 4005 5005 7105
7105
;
run;
data table2;
length id 8 names $ 10;
input id names;
cards;
1005 John
3005 Rick
4005 Sam
5005 Harry
2005 Mary
7105 Deena
;
run;
* Create a CNTLIN data set defining the required format;
data fmt_in;
set table2;
fmtname = 'names';
start = id;
label = names;
run;
* Run PROC FORMAT to generate the format from the CNTLIN data set;
proc format cntlin=fmt_in;
run;
* Apply the format to the input data set;
data out;
set table1;
namesID = put(id, names.);
namesID1 = put(id1, names.);
namesID2 = put(id2, names.);
namesID3 = put(id3, names.);
namesID4 = put(id4, names.);
namesID5 = put(id5, names.);
run;
标准化为高而细,以便只有一列包含ID。这可能会使基于合并的解决方案变得微不足道,尽管可能仍比使用格式慢。