そのソートは本当にSASがソートしているのか?_ソートの実施主体による落とし穴

ソート、つまり並び替えの仕方というものは、システムによって異なることがあります。

例えばSASはnull値を含む変数でソートを行った場合、Nullは疑似的に最小とみなされ、先頭にまわされます。
EXCELなんかの並び替えでも、同じルールなので、これが万国共通唯一真実かと思いがちですが
例えばOrcaleではNull値を含む変数でソートを行った場合、Nullは疑似的に最大とみなされ、最終にまわされます。

ふ~ん、でもSASでプログラム書くのに、そんなルール何が関係あるの?って感じなのですが
例えば、

今OracleのあるスキーマをLIBNAMEで「OLIB」という名前をつけてライブラリ参照していたとします。
そこで、
proc sort data=OLIB.Q1 out=A1;
 by X;
run;

とすると、ソートはSASのソートルールではなく、参照ライブラリのソートルールが適応されてしまうのです。つまり、欠損値があった場合、先頭にきません。

これは場合によっては、思わぬエラーの原因となりえます。


で、データが何によってソートされたかを確認する方法ですが、それはログをみましょう










NOTEの一つ目に「ソートがデータソースによって実行されました。
とでていれば、それはライブラリ参照している、アプリケーションによって行われたソートです。
その外部システムのソート順について理解していれば問題ないですが、安全策としては
一度普通にWORK等に落としてからソートに掛ければ、かならずSASがソートするのでそっちの方がいいかもしれません。

あと、あまり役にたたない裏知識ですが、通常options msglevel=iで追加表示されるメッセージは
すべて「INFO:」のはずなのですが、ひとつ例外を見つけましたそれは

proc sort data=A1;
 by Y ;
run;











上記のログの2つめのNOTE「NOTE: SAS ソートを使用しました。」なのです。
なんとこいつNOTEのくせにmsglevel=iになって初めて出現するのです。なんだそれ


あとSASのFAQで公開されている情報なので、詳細は省きますが
proc sortのソート法とSQLプロシジャ内でorder byを使ったソートは、結果に微妙な違いが
でる場合があるので要注意です。
なおSQLでソートした場合は「NOTE: SAS ソートを使用しました。」はでません、SASソートじゃないので。

http://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/ba001.html





0 件のコメント:

コメントを投稿