【问题标题】:SAS SQL Macro to join multiple datasets into oneSAS SQL 宏将多个数据集合并为一个
【发布时间】:2013-09-06 13:52:27
【问题描述】:

下面的 SQL 宏有什么问题?

我有多个名为“C_out1”2、3、4 等的数据集,我想从每个数据集中只提取一个数字到一个新表中。我已经搜索并寻求帮助,但没有任何运气。

我只在一个数据集上测试了没有宏元素的代码,并且效果很好,但是当我尝试使用以下代码使其动态化时,它失败了。

我可以使用简单的数据步来完成这项工作,但我对 SQL 语言还很陌生,我真的很想能够做到这一点。我必须加入近 200.000 个数据集,所以我猜测 SQL 比数据步骤更可取。

我得到错误:

"NOTE: Line generated by the macro variable "I".
1             C_out5
              ------
              78
ERROR 78-322: Expecting a ','.

974          where label2='c';
975  quit;

代码:

 %macro loop(prefix2);
    %do i=1 %to 5;
        &prefix2&i
        %let i = %eval(&i+1);
    %end;
    %mend loop;

    PROC SQL;   
    create table CTOTAL as
        select nvalue2
        from %loop(C_out)
        where label2='c';
    quit;

【问题讨论】:

  • 除了我的回答之外,我还要在这里指出,如果需要创建 200,000 个数据集,您可能正在以低效的方式做任何事情。你在做引导分析或类似的事情吗?
  • 创建 200k 数据集并不是执行任何与数据库相关的任务的正确方法。如果这是您流程的一部分,您绝对应该重新考虑。

标签: sql macros sas


【解决方案1】:

数据步骤是比 SQL 更好的方法。

data CTOTAL;
set C_out:;
where label2='c';
run;

如果您没有使用所有 c_out 数据集,您可能需要做一些工作来改进这一点,但如果您使用所有 c_out 数据集,那么这将照常工作。

【讨论】:

    【解决方案2】:

    乔的回答是最好的。

    如果必须使用 SQL:

    您的 SQL 不正确。您需要使用 UNION ALL 来执行此操作。此解决方案适用于 SQL:

    %macro loop(prefix2);
        %do i=1 %to 4;
            select nvalue from &prefix2&i where str='c' union all
        %end;
        select nvalue from &prefix2&i where str='c'
    %mend loop;
    
    PROC SQL;   
    create table CTOTAL as
        %loop(C_out)
        ;
    quit;
    
    1. 无需手动增加&i 值。
    2. 循环会将&i 放到最后一个循环的(n+1) 处,因此使循环转到(n-1) 并在循环外输出最后一条语句。

    【讨论】:

    • 两者,非常感谢您的回答。我的印象是 SQL 通常比数据步骤更好,这就是我想使用 SQL 的原因(并练习和探索机会)。约 20 万个数据集是约 20 万个回归的结果,每个回归输出一些我想比较的 C 和 AIC 度量。通过将所有数据放在一个数据集中,可以轻松排序并找到最高值和最低值。这就是为什么我想使用 SQL 来合并数据。我认为没有任何简单的方法可以解决这个问题。
    • 您可以同时测试两者,看看哪个花费的时间最少。由于为每条记录加载 PDV 的开销,DATA 步骤可能会更慢。
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2011-02-21
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多