Sql 基于一个变量值的多个数据集/表的条件组合
我看到了一些与我的问题相关的问题,但从来没有完全相同的结构,而且由于我对SAS/SQL非常陌生,我无法找到解决问题的正确方法 我尝试了几天来加入多个表(大约30个) 基本上,我的问题归结为: 假设我有3张桌子: 选项卡,带有两个变量V1和V2 t1,带有两个变量V2和V3 t2,具有相同的2个变量V2和V3 我想根据V2的值将TAB与t1或t2连接起来,以获得完整的_表Sql 基于一个变量值的多个数据集/表的条件组合,sql,join,merge,sas,Sql,Join,Merge,Sas,我看到了一些与我的问题相关的问题,但从来没有完全相同的结构,而且由于我对SAS/SQL非常陌生,我无法找到解决问题的正确方法 我尝试了几天来加入多个表(大约30个) 基本上,我的问题归结为: 假设我有3张桌子: 选项卡,带有两个变量V1和V2 t1,带有两个变量V2和V3 t2,具有相同的2个变量V2和V3 我想根据V2的值将TAB与t1或t2连接起来,以获得完整的_表 TAB V1 V2 A 1 B 1 C 2 D 2 t1 V2 V3 1 x 1 y 1 z
TAB
V1 V2
A 1
B 1
C 2
D 2
t1
V2 V3
1 x
1 y
1 z
t2
V2 V3
2 h
2 i
2 j
预期结果:
Full_TABLE
V1 V2 V3
A 1 x
A 1 y
A 1 z
B 1 x
B 1 y
B 1 z
C 2 h
C 2 i
C 2 j
D 2 h
D 2 i
D 2 j
从逻辑上讲,它是基于V2值的条件联接:
- 如果V2=1,则将制表符与t1合并
- 如果V2=2,则将制表符与t2合并
S您可以使用
proc-sql
和一些sql技巧来实现这一点:
proc sql;
select tab.v1, tab.v2, coalesce(t1.v3, t2.v3) as v3
from tab left join
t1
on tab.v2 = 1 left join
t2
on tab.v2 = 2;
数据步骤解决方案很有趣:
data want;
set tab;
if v2=1 then do;
do _n_ = 1 to nobs_t1;
set t1 point=_n_ nobs=nobs_t1;
output;
end;
end;
else if v2=2 then do;
do _n_=1 to nobs_t2;
set t2 point=_n_ nobs=nobs_t2;
output;
end;
end;
run;
这是标准的“数据步骤中的笛卡尔连接”,只做了两次,if告诉SAS该做什么
基本上,根据v2的值,使用
点
迭代t1或t2。如果需要允许许多表/变量值(类似于扩展sql解决方案的方式),可以通过宏语言进行扩展。在我看来,T1和T2是同一个表,根据V2的值被拆分为两个。为什么不把他们联合起来然后加入呢
proc sql ;
create table want as
select a.*,b.v3
from tab a
, (select * from t1 union select * from t2) b
where a.v2 = b.v2
;
quit;
对于中等大小的数据集,特别是适合内存的t1/t2,这比SQL快得多—大约快10倍。对于t1/t2不适合内存的超大数据集,我不确定它是否快得多(我没有时间测试多分钟写入,而且随着t1/t2变大,它需要更长的时间)。