0

次のようなマクロを使用してテーブルを動的に構築する SAS プログラムがあります。

%macro Projection;
%do i=1 %to &number_of_Years;
    %Advance_Years;
     proc sql;
      create table Projection as 
      select *, Year_&previous_year.*(1+return) as Year_&current_year.
      from Projection;
      quit;
%end;
%Mend Projection;

%Projection;

これは私のコードの簡略版です。%Advance_Yearsマクロは基本的に進み&current_year&previous_year1年のマクロ。ご覧のとおり、このテーブルは 1 年に 1 つの変数を取得します。問題は、このテーブルの行数が数十万に達する可能性があり、実行時間が急上昇し、完了までに数時間に達することです。

私は試してみましoption compress=yesたが、実行時間を短縮するのに役立ちましたが、それほど多くはありませんでした。実行を高速化するためのほとんどの SAS のヒントとコツを試しましたが、やはり大きな違いはありませんでした。32b で Base SAS 9.2 を実行しています。

変数を追加する手法について、私は間違った見方をしていると思います。ループごとにテーブルを上書きすると、実行効率に影響がありますか? はいの場合、これを可能な限り最も効率的なコードに書き直すにはどうすればよいですか? テーブルを「転置」して行を追加することはできないことに注意してください。前もって感謝します!

4

2 に答える 2

1

同じテーブルを上書きすると、多くのパフォーマンスの問題が発生していると思います。

あなたが取るべきだと思う解決策を説明させてください。私の SQS マクロ プログラミング スキルは少し錆びているので、実際の実装はお任せします。

まず、テーブルを変更Projectionして、追加する列を含めます。理想的には、これを 1 つのステートメントで実行します。しかし、次のようなことができます:

%do i=1 %to &number_of_Years;
    %Advance_Years;
    alter table Projection
        add Year_&current_year double;
%end;

次に、ループしてその場で計算を行います。

%do i=1 %to &number_of_Years;
    %Advance_Years;
    update table Projection
        set Year_&current_year = Year_&previous_year.*(1+return);
%end;
于 2013-08-05T23:57:58.807 に答える