投稿

ラベル(statement: where)が付いた投稿を表示しています

whereステートメントで処理時間を遅くする書き方 ~年月でオブザベーションを絞り込む~ - SAS

年月でオブザベーションを絞り込む方法について質問を受けたとき、処理効率の話になったので、その話をまとめてみました。 オブザベーションを条件式で絞り込む方法には、whereステートメントとサブセット化 ifステートメントがあります。基本的には、whereを使ったほうが処理速度が早いのですが、書き方によっては if 並に遅くなってしまいます。 下記に、2015年6月のデータのみに絞り込むための 5つのサンプルパターンを作成しました。 年月で絞り込むテストコード options lognumberformat ; /* ログのオブザベーション数にカンマを付ける */ /* テストデータ */ data TEST ; format DT yymmdds10. ; do I=1 to 100000000 ; /* 1億 */ /* 2015/01/01 から 365日間のいずれかのSAS日付を項目 DT に格納します */ DT = mdy(01, 01, 2015) + int(365 * ranuni(1)) ; output ; end ; run ; /* 2015年6月に絞り込むためのマクロ変数を定義します */ %let TARGET_MONTH = %sysfunc(mdy(6, 1, 2015)) ; %let TARGET_YYYY = %sysfunc(year(&TARGET_MONTH.)) ; %let TARGET_MM = %sysfunc(month(&TARGET_MONTH.)) ; %put &=TARGET_MONTH. ; %put &=TARGET_YYYY. ; %put &=TARGET_MM. ; /* intnx関数から来月の月初を算出して、絞り込む */ data TEST1 ; set TEST ; where &TARGET_MONTH. <= DT < intnx('MONTH', &TARGET_MONTH., 1, 'BEGINNING') ; run ; /* intnx関数から今月の月末を算出して、絞り込む */ data ...