SORTプロシジャ

Last-modified: 2008-06-17 (火) 02:20:55

SORTプロシジャは,SASデータセットのオブザベーションの順番を並べかえるプロシジャです.
基本的には,並べ替えたいSASデータセット名と並べ替えるキーとしたい変数名を指定するだけですが,幾つかのオプション機能が用意されてます.

proc sort data=sashelp.class out=class;
  by age sex;
run;
/*
OBS    Name       Sex    Age    Height    Weight

  1    Joyce       F      11     51.3       50.5
  2    Thomas      M      11     57.5       85.0
  3    Jane        F      12     59.8       84.5
  4    Louise      F      12     56.3       77.0
  5    James       M      12     57.3       83.0
 */

構文

PROC SORT <オプション>;
  BY 変数 ..;
  WHERE 条件式;
RUN;

PROC SORTステートメント

PROC SORT <オプション>..

PROC SORTステートメントオプション

  • DATA=SASデータセット名
  • DATA=SASデータセット名(データセットオプション ..)
    並べ替える元SASデータセット名を指定.デフォルトは,data=_last_ 最後に処理されたデータセットが対象となる.
  • OUT=SASデータセット名
  • OUT=SASデータセット名(データセットオプション ..)
    並べ替えた後のSASデータセット名を指定.この指定がないと,元のSASデータセットに並べ替えたSASデータセットが上書きされる
  • DATECOPY
    SASデータセットの作成日と最新更新日を保持します.
  • NODUPKEY
    同じキー変数(複数あればすべて)の値が一致しているオブザベーションは,最初のオブザベーションを残して他を削除します.重複するキーを許さない処理です.
  • NODUP
  • NODUPRECS
    並べ替えた結果,キー変数だけでなくすべての変数の値が,ひとつ前のオブザベーションと同一であれば,削除します.基本的には重複するデータを許さない処理です.ただし,ソートキー変数以外の順序は,一意ではないので,同じ値のオブザベーションでも隣に並ぶとはかぎらず,その場合は削除されませんのでご留意ください.
  • DUPOUT=SASデータセット名
    NODUPKEYまたは,NODUPRECSで重複削除されたオブザベーションを格納します.この指定がなければ,重複オブザベーションは,削除されたままです.
  • EQUALS | NOEQUALS
    同順位のオブザベーションの並びに関して,入力データでの順序を保持する(EQUAL)か,保持しなくていいか(NOEQUAL)を指定します.EQUALSがデフォルトですが,機械まかせのNOEQUALSのほうが,処理の負荷は小さくなります.
  • REVERSE
    ソート順を逆にします.文字コードオプション(ASCII,EBCDIC..)とは併用できません.
  • ASCII | EBCDIC | DANISH | FINNISH | NORWEGIAN | SWEDISH | NATIONAL
    ソート順となる文字コードは,Windows,UNIX,VMSは,ASCIIコード,メインフレームは,EBCDICコードがデフォルトになります.デフォルトではないソートを行いたい場合,その文字コードを指定します.また,REVERSEオプションとは併用できません.
    ASCIIとEBCDICの典型的な違い
    ACII   数字 < 英大文字 < 英小文字
    EBCDIC 英小文字 < 英大文字 < 数字
  • FORCE
    INDEX付SASデータセットや,すでにソート済み情報が記録されてるSASデータセットは,ソートを指示しても,ソート済みとして,実行されませんが,強制的に実行したい場合に,FORCEオプションを指定します.
  • OVERWRITE
    入力SASデータセットを出力SASデータセットが出力し終わる前に削除することを許します.これは大きいファイルの処理には資源節約になりますが,処理に異常があった場合,元データまで失いますので,バックアップのない場合は行ってはいけません.
  • SORTSIZE= MAX | n | nK | nM | nG
    ソート時に使用するメモリサイズを指定します.MAXは,使用可能な最大値です.
    メモリ不足でソート時間がかかっているような場合であれば,このサイズを大きくしてみるとよいです.デフォルトは,SORTSIZE=システムオプションの値です.
  • TAGSORT
    先にキー変数だけでソートする方法です.キー以外の変数が多い場合,ハードディスクに空きが少ない場合などに有効です.
  • THREADS | NOTHREADS
    マルチスレッドソートを有効,無効にします.デフォルトは,THREADSシステムオプション(NOTHREADSシステムオプション)です.

BYステートメント

BY 変数1 変数2 ..;
BY 変数1 DESCENDING 変数2 ..;
BY 変数1 DESCENDING 変数2 .. NOTSORTED;

BY変数の値で昇順ソートを指示する.列挙された順が第1ソートキー,第2ソートキーなどとソートキーの順になる.なお降順ソートしたい変数には,それぞれ変数の前にDESCENDINGをつけなければならない.
see also 汎用的なステートメント

WHEREステートメント

WHERE 条件式;

表示対象となるオブザベーションを条件式に合致するものだけに制限します.
see also 汎用的なステートメント

サンプル

住所変更履歴(addressHST)から,2007/1/1時点での住所コード(addreeCD)の一覧(address2007)を作成する.
まず,2007/1/1以前の変更履歴を顧客番号(customerID)毎に,更新日(date)で降順にソートする.次に,再度顧客番号毎に,先頭の更新日だけを残し,他を削除すれば,2007/1/1に対しもっとも最新の更新データだけが残ることになる.

data addressHST;
  input date yymmdd8. customerID addressCD;
  format date yymmdd10.;
cards;
20040725	288157	205
20050315	180757	385
20050703	524357	109
20060418	288157	215
20060612	524357	101
20071222	180757	201
20080806	180757	147
;

proc sort data=addressHST out=address2007;
  by customerID descending date;
  where date<"01jan2007"d;
run;

proc sort nodupkey data=address2007;
  by customerID;
run;
/*
OBS          date    customerID    addressCD

 1     2005-03-15      180757         385
 2     2006-04-18      288157         215
 3     2006-06-12      524357         101

注)2番目のソートは,EQUALS指定がデフォルトであることを暗黙に利用している.
明示的でないことが気になるならば,以下のDATAステップで,明示的に最初の
オブザベーションを取り出す記述で同じ結果を得ることもできる.
data address2007;
  set address2007;
  by customerID;
  if first.customerID;
run;
 */