2011年2月20日日曜日

SQLプロシジャを利用したSASデータセットの存在チェック


Awaiting servers
Creative Commons License photo credit: bugeaters

売上データなどを利用して分析をする場合、複数のデータテーブルを同時に読み込んで処理を実行することがあるかと思います。

例えば・・・

 ・売上データを過去10年分読み込み売上の推移を求める。
 ・直近1年分の売上データ、予算目標データを読み込んで売上目標に満たない店舗を求める。

などなど様々な要件が考えられます。

その様々な要件に応じて対象となるデータを読み込むように処理を作る必要があるわけです。
プログラムを組むという観点では、処理を実行する前に対象となるデータテーブル(SASの場合だとSASデータセット)が存在している事を確認した上で処理を実行するほうが望ましいです。

SASデータセットの存在確認のプログラム例



%SYSFUNC(EXIST(データセット名)) ;



しかし、上記の例で上げたように過去10年分のデータを読み込むなどの場合は、存在確認を10年分記述するのは大変かと思います。
データ件数が膨大だと予想される売上データなどは、月毎にデータを分けて保存していると考えられます。
10年分なので、120ヶ月分の存在確認を記述することになります。
正直大変なので、そのままの方法ではやりたくありません。

WORKの下に以下のようにデータがあるとします。



以下のようなプログラムを使用して、データの確認を行うことが出来ます。


proc sql;
 select
  min(substr(memname,8,6)) as MIN,
  max(substr(memname,8,6)) as MAX,
  count(*) as COUNT_TBL
 from
  dictionary.tables
 where
  libname = "ライブラリ名" and
  substr(memname,1,7) = "データセット名称(一部)"
 ;
quit;


※上記のデータセットの存在を確認する場合は、ライブラリ名に"WORK"、データセット名称には"URIAGE_"を入れます。

実行結果例






DICTIONARY.TABLES にはlibnameで追加された先のSASデータセット(ビュー)、workで作成されたSASデータセット(ビュー)の情報が格納されています。
データセットの作成、または削除された時に意識しなくても更新がかかります。
このテーブルには どのライブラリに存在するかを示す"libname"、とSASデータセット名称を示す"memname"があります。
それを利用してデータセットの確認をしてしまうという方法です。

上記のプログラムはWORKライブラリにある、データセット名称の頭7文字が"URIAGE_"で始まるデータセットの件数を求めるプログラムです。

 ・件数が処理対象になる年月の数と同じになること。
 ・SQLで返される結果の最大の年月が、処理対象の最大年月と同じになることを確認する。
 ・SQLで返される結果の最小の年月が、処理対象の最小年月と同じになることを確認する。

このことにより論理的にデータのチェックを行うことが出来ます。


ただし、この方法には弱点として、読み込む対象のSASデータセット名称が一定の規則で作成されていることが条件になります。
何らかの方法で対象のデータセット群だけを特定する方法が明確である必要があります。

例) 売上データの場合、URIAGE_[年月]という名称の13文字のデータセットで作成する。

などの場合は頭文字7文字分が『URIAGE_』であれば売上のデータとして特定できるため使用ができますが、仮にURIAGE_YOSANというデータセットが存在した場合は正しい件数が取得できなくなる恐れがありますので、抽出条件を変えて特定できるようにするなど工夫が必要です。

投稿者:NI原


[google]

0 件のコメント:

コメントを投稿

ツイート数からみる"バーチャルYouTuber"ブーム

今や YouTuber の話題の半分を占めるほどのクチコミ数に 当社が提供するソーシャルビッグデータ検索ツールの「 beInsight (ビーインサイト)」を使って、話題の「バーチャル YouTuber 」について調べてみました。 「バーチャル YouTuber...