SAS合并具有相同数据的多列

时间:2019-02-05 14:16:02

标签: merge sas

我需要合并帮助。我有两个表如下- 表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                                       

谢谢!

1 个答案:

答案 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。这可能会使基于合并的解决方案变得微不足道,尽管可能仍比使用格式慢。