【问题标题】:Left join table on multiple tables in SASSAS中多个表的左连接表
【发布时间】:2018-01-24 13:17:08
【问题描述】:

我有多个格式相同且变量相同的主表。我现在想加入另一个变量,但由于计算机上的存储空间有限,我无法合并主表。有没有一种方法可以让我将一个变量加入到一个 PROC SQL 中的多个主表中?也许在宏的帮助下?

LEFT JOIN 代码对于一个连接看起来像这样,但我正在寻找一种替代方法,而不是复制和粘贴 5 次:

PROC SQL;
CREATE TABLE New AS
    SELECT a.*, b.Value
        FROM Old a LEFT JOIN Additional b
            ON a.ID = b.ID;
QUIT;

【问题讨论】:

  • 如果你的内存不足,我建议你这个'老派':1)按公共变量对数据进行排序。 2) 通过公共变量使用Merge 语句。查看更多来自documentation.sas.com/…
  • @pinegulf Storage != 内存,如果比数据步合并(不一定需要排序,可能会使用内存),SQL 的存储空间会更轻。
  • 表是否在 SAS 中压缩?如果没有,也许您可​​以这样做以释放空间。
  • 我还要注意,您上面描述的存储效率并不比将它们全部组合到一个表中更有效:您在这里的总存储量增加了一倍。如果这是可以接受的,那么这里的视图可能足以进行初始合并前合并?

标签: join macros sas left-join


【解决方案1】:

您不能在一个create table 语句中执行此操作,因为它一次只创建一个表。但是你可以做一些事情,这取决于你的实际限制因素是什么(你提到了一些)。

如果您只是想避免编写五次相同的代码,但不关心它的执行方式,那么只需将代码编写在宏中,就像您引用的那样。

%macro update_table(old=, new=);
PROC SQL;
CREATE TABLE &new. AS
    SELECT a.*, b.Value
        FROM &old. a LEFT JOIN Additional b
            ON a.ID = b.ID;
QUIT;
%mend update_table;
%update_table(old=old1, new=new1)
%update_table(old=old2, new=new2)
%update_table(old=old3, new=new3)

当然,如果五个表的名称在一个模式中,您也许可以根据该模式进一步自动化,但您没有提供足够的信息来弄清楚这一点。

另一方面,如果您需要在 处理 方面比运行 SQL 查询更有效地执行此操作,则可以通过多种方式完成此操作,具体取决于您附加的具体情况表和您的具体限制。例如,在我看来,您在这里有一个很好的格式查找用例;参见例如Jenine Eason's paper, Proc Format, a Speedy Alternative to Sort/Merge。如果你只是在 ID 上合并,这很容易。

data for_format;
  set additional;
  start = ID;
  label = value;
  fmtname='AdditionalF'; *or '$AdditionalF' if ID is character-valued;
  output;
  if _n_=1 then do;  *creating an "other" option so it returns missing if not found;
    hlo='o';
    label = ' ';
    output;
  end;
run;

然后您只需使用带有 PUT 语句的五个数据步骤添加值,或者您甚至可以简单地使用该格式设置 ID 变量的格式,并且它会拥有该值PROC(如果这类似于您并不真正需要“放入”数据中的分类器)。

【讨论】:

    【解决方案2】:

    您可以使用哈希表在数据步骤中一次性遍历数据以查找值。

    data new1 new2 new3;
    set old1(in=a) old2(in=b) old3(in=c);
    format value best.;
    if _n_=1 then do;
        %create_hash(lk,id,value,"Additional");
    end;
    value = .;
    rc = lk.find();
    
    drop rc;
    
    if a then
        output new1;
    else if b then 
        output new2;
    else if c then
        output new3;
    run;
    

    %create_hash() 宏可用here

    您也可以使用 Joe 的格式和相同的 Data Step 语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2016-07-08
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多