SASの一貫性制約(IC:integrity constraints)の話

Base SASにはデータセット内容の修正・変更を管理する技術が多く実装されていますが
日本での知名度がとても低く、利用例の報告が少ない気がします。

ただ、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 件のコメント:

コメントを投稿