【问题标题】:Conditional combining of multiple datasets/tables based on a value of one variable基于一个变量的值有条件地组合多个数据集/表
【发布时间】:2016-02-23 09:40:09
【问题描述】:

我看到了一些与我的问题相关的问题,但从来没有完全相同的结构,而且由于我对 SAS/SQL 很陌生,我找不到解决问题的正确方法。

我尝试了几天加入多个表(大约三十个)

基本上,我的问题归结为:

假设我有 3 张桌子:

TAB,有 2 个变量 V1 和 V2 t1,有 2 个变量 V2 和 V3 t2,具有相同的 2 个变量 V2 和 V3

我想根据 V2 的值将 TAB 与 t1 或 t2 加入以获得 Full_TABLE

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,则将 TAB 与 t1 合并

  • 如果 V2=2 则将 TAB 与 t2 合并

不知道能不能自动做,

粗略地说,V1 有 30.000 个不同的值,V2 有 27 个(所以 27 个表 t1-t27),V3 每个 V2 值有 10 个值,因此我预计 Full_TABLE 为 30.000*10=300.000 行

所以我可以管理基于 V2 和/或 V3 而非 V1 的半自动化解决方案

高度赞赏 SAS 或 SQL(或 proc sql...)方面的任何线索!

S

【问题讨论】:

    标签: sql join merge sas


    【解决方案1】:

    在我看来,T1 和 T2 是同一张表,根据 V2 的值分为两个。为什么不直接 UNION 他们然后加入?

    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;
    

    【讨论】:

      【解决方案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 要做什么。

      基本上,您可以使用point 来迭代 t1 或 t2,具体取决于 v2 的值。如果需要允许许多表/变量值,这可以通过宏语言进行扩展(类似于扩展 sql 解决方案的方式)。

      【讨论】:

      • 对于中型数据集,尤其是适合内存的 t1/t2,这比 SQL 快得多 - 大约快 10 倍。对于 t1/t2 不适合内存的超大数据集,我不确定它是否更快(我没有时间测试多分钟的写入,并且随着 t1/t2 变大,它需要更长的时间)。
      【解决方案3】:

      您可以使用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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-29
        • 1970-01-01
        • 2014-10-06
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 2016-03-19
        相关资源
        最近更新 更多