SORTについて

[OS]all
[リリース] 6.09E,6.12,8.1,8.2
[キーワード] SORT, EQUALS オプション, SQL, SORT BY

[質問]

SQLプロシジャのORDER-BY アイテムを使ってソートを行なった結果と、 SORTプロシジャを使ってソートを行なった結果が異なります。
どうしてでしょうか。

(違いが発生するデータセット例:test2aとtest2bのオブザベーションの並び順が異なります)


     DATA test1 ;
       INPUT var1 var2 $ var3 $ ;
     DATALINES ;
     2 BBB  2_BBB_3
     1 BBB  1_BBB_1
     2 AAA  2_AAA_2
     2 AAA  2_AAA_1
     1 BBB  1_BBB_2
     2 BBB  2_BBB_4
     2 BBB  2_BBB_2
     2 BBB  2_BBB_1
     1 AAA  1_AAA_2
     1 AAA  1_AAA_1
     1 BBB  1_BBB_3
     ;
     RUN ;

     PROC SORT DATA=test1 OUT=test2a ;
       BY var1 var2 ;
     RUN ;

     PROC SQL ;
       CREATE TABLE test2b AS SELECT * FROM test1 
       ORDER BY var1,var2 ;
     QUIT ;

[回答]

SQLプロシジャのORDER-BYアイテムによるソートは、 SORTプロシジャを「NOEQUALS」オプション付きで実行した場合と同じ結果になります。

例)

     PROC SORT DATA=test1 OUT=test2c NOEQUALS;
       BY var1 var2 ;
     RUN ;

「EQUALS」オプションは、「SORT時のインプットとして読み込んだデータセット にあるオブザベーションの相対位置を保持する」機能を持ち、 SORTプロシジャにおいてはデフォルトです。
一方、SASの本来のソート処理は、SORTプロシジャの「NOEQUALSオプション」が 指定されているのと同じ結果となるのがデフォルトです。 よってソートキーに重複がある場合、そのオブザベーションの順番は、 入力データセットにおけるオブザベーションの順番と必ずしも一致しません。

なお、ソート処理によって出力されるオブザベーションの順番は、 変数の数や各変数の属性などによって決定されます。

     DATA test1a ;
       INPUT var1 var2 $ var3 $ ;
     DATALINES ;

     (入力データ)

     ;
     RUN ;

     DATA test1b ;
       LENGTH var4-var20 $ 200  ;
       INPUT var1 var2 $ var3 $ ;
     DATALINES ;

     (入力データ)

     ;
     RUN ;

たとえば、上記のデータセット「test1a」および「test1b」では、変数の数に違いがあるため、 SORTプロシジャの「NOEQUALSオプション」を使ってソートを行なった場合、 オブザベーションの並び順が異なります。