例えば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 件のコメント:
コメントを投稿