日本での知名度がとても低く、利用例の報告が少ない気がします。
ただ、SAS認定プロフェッショナルのAdvancedの試験を公式テキストで学習された方は、そこに記載があるので知っている人が多いかもしれません。
今までこのブログでは
・世代データセット(Generration Datasets)
記事「世代管理機能でデータセットの更新履歴(更新前後のDS)を残す_GENMAX=オプション」
http://sas-tumesas.blogspot.jp/2013/11/dsgenmax.html
・監査証跡(Audit Trail)
記事「SASのAudit Trail(監査証跡)機能について」
http://sas-tumesas.blogspot.jp/2014/06/sasaudit-trail.html
などに触れたことがありますが、今回は
一貫性制約(IC:integrity constraints)について紹介します。
例えば今、以下のデータセットがあったとします。
data Q1;
X='A';Y=1;output;
X='B';Y=2;output;
X='C';Y=3;output;
run;
そしてこのQ1にこれから、データをどんどん追加していくとします。
しかしQ1というデータセットには、その内容について以下のルールがあるとします。
ルール1:Xの値はユニークで、非欠損値であること
ルール2:Yの値は非欠損値であること
ルール3:Yの値は3以下であること
ルール4:Xの値が「G」かつYの値が「1」であってはいけない
上記のルールに外れるデータは、データセット内に存在してはいけないとします。
そういった際に、データの追加・変更の都度、条件式を書いてチェックしていては大変です。
そこで、データセットそのものに、データの一貫性を保つ制約を設定しておくことで、自動的に
ルールに外れるものをはじく仕組みを作成できます。
具体的にはdatasetsプロシジャを使って
proc datasets nolist;
modify Q1;
ic create rule1=primary key(X)
message='Xがユニークでないか、欠測値だから許容できません!';
ic create rule2=not null(Y)
message='Yは欠損値であってはならぬ!';
ic create rule3=check(where=(Y<=3))
message='Yは3以下!';
ic create rule4=check(where=(not(X='G' and Y=1)))
message='XがGかつYが1の組み合わせは不可!';
run;
quit;
と書きます。
ic create 任意のルール名=ルールで一貫性制約を作成します。
message=はルールによってデータが弾かれた場合に、ログに表示されるメッセージです。
ルールの記述法はSASのヘルプ等で確認してください。
そして
data Q2;
X='A';Y=1;output;
X='D';Y=.;output;
X='F';Y=4;output;
X='G';Y=1;output;
X='H';Y=2;output;
run;
というデータセットを先ほどのQ1に追加してみます。
proc append base=Q1 data=Q2;
run;
すると
ログに
「WARNING: Xがユニークでないか、欠測値だから許容できません! データセット WORK.Q1
への追加/更新に失敗しました。データ値が一貫性制約 rule1 に適合しません。 1 オブザベーションが拒否されました。
WARNING: XがGかつYが1の組み合わせは不可! データセット WORK.Q1
への追加/更新に失敗しました。データ値が一貫性制約 rule4 に適合しません。 1 オブザベーションが拒否されました。
WARNING: Yは3以下! データセット WORK.Q1 への追加/更新に失敗しました。データ値が一貫性制約 rule3に適合しません。 1 オブザベーションが拒否されました。
WARNING: Yは欠損値であってはならぬ! データセット WORK.Q1 への追加/更新に失敗しました。データ値が一貫性制約rule2 に適合しません。 1 オブザベーションが拒否されました。
」
とでて、
Q1に追加されたのは1オブザベーションのみで、後は全てルールにひっかかって
追加されなかったいうことがわかります。
永久データセットに対して、データの追加や変更を繰り返しながら、保守していくような状況の
場合、これを設定しておくと、一貫性が保たれるので便利です。
0 件のコメント:
コメントを投稿