前のページ|次のページ

BYステートメント

DATAステップ内のSET、MERGE、MODIFY、UPDATEの各ステートメントの実行を制御し、特別なグループ変数を設定します。

該当要素: DATAステップまたはPROCステップ
カテゴリ: ファイル操作
種類: 宣言

構文

引数

DESCENDING

指定した変数の値を基にデータセットを降順で並べ替えるように指定します。降順では、数値変数であれば最大値から最小値に、文字変数であれば逆アルファベット順に並べ替えが実行されます。.

制限事項 インデックス付きデータセットにはDESCENDINGオプションを使用できません。これは、インデックスが常に昇順で保存されるためです。
並べ替え順序の指定

GROUPFORMAT

BY変数の内部値ではなく、フォーマット値を使用して、BYグループの開始と終了が指定されます。このため、FIRST.変数とLAST.変数がどのように割り当てれるかが指定されます。GROUPFORMATオプションはBYステートメントのどの位置に指定してもかまいません。このオプションは、BYステートメントにあるすべての変数に適用されます。

制限事項 BYステートメントでGROUPFORMATオプションを使用する前に、BY変数の値に基づいてデータセット内のオブザベーションを並べ替える必要があります。
BYステートメントのGROUPFORMATオプションは、DATAステップのみで使用できます。
操作 また、NOTSORTEDオプションを使用する場合、データセットを並べ替えたり、インデックスを作成することなく、データセット内のオブザベーションをBY変数のフォーマット値に基づいてグループ化することができます。
GROUPFORMATを使用したDATAステップでのBYグループ処理は、SASプロシジャでのフォーマット値のBYグループ処理と同じです。
ヒント GROUPFORMATオプションは、グループ化するデータの表示に独自の出力形式を定義する場合に便利です。
DATAステップでGROUPFORMATオプションを使用すると、データセットの作成に使用するBYグループと、グループ化され、フォーマットされたデータをレポートするPROCステップのBYグループを一致させることができます。
参照項目 XisError: No pubcode in link data found for lrcon
フォーマット値を用いてオブザベーションをグループ化する

variable

データセットの並べ替えやインデックス付けに使用される変数を指定します。指定した変数は、現在のDATAステップまたはPROCステップのBY変数として参照されます。

要件 BYグループ処理でBY変数として名前リテラルを指定し、対応するFIRST.一時変数またはLAST.一時変数を参照する場合、FIRST.またはLAST.が含まれる2レベル変数名を一重引用符で囲んで指定する必要があります。例えば、
data sedanTypes;
   set cars;
   by 'Sedan Types'n;
   if 'first.Sedan Types'n then type=1;
run;
ヒント データセットでは、複数の変数を基準に並べ替えやインデックスの作成を実行できます。
BY変数の指定

並べ替え順序の指定

並べ替えを実行していないデータのBYグループ処理

フォーマット値を用いてオブザベーションをグループ化する

NOTSORTED

同じBY変数の値を含むオブザベーションをグループ化します。ただし、これらのオブザベーションはアルファベット順または数値順では並べ替えられません。

制限事項 MERGEおよびUPDATEステートメントでは、NOTSORTEDオプションを使用できません。
ヒント NOTSORTEDオプションはBYステートメントのどの位置に指定してもかまいません。
NOTSORTEDオプションは、日付順やカテゴリなど他の論理グループに分類されるデータが存在する場合に便利です。
並べ替えを実行していないデータのBYグループ処理

詳細

BYグループの開始と終了の識別について

BYグループの開始と終了は、BY変数に2つの一時変数を作成して識別します。この2つの一時変数とは、FIRST.変数とLAST.変数です。この2つの変数の値は0または1のどちらかになります。FIRST.変数の値は、BYグループの最初のオブザベーションを読み込むときに1に設定されます。LAST.変数の値は、BYグループの最後のオブザベーションを読み込むときに1に設定されます。これら2つの一時変数は、DATAステップでのプログラミングには利用できますが、出力データセットには変数として書き出されません。
グループ化したデータをSASでの処理およびデータの準備の詳細については、XisError: No pubcode in link data found for lrconを参照してください。

DATAステップ

BYステートメントは、DATAステップでその前に指定されているSET、MERGE、MODIFY、UPDATEのステートメントに適用されます。ただし、DATAステップ内のこれらの各ステートメントに指定できるBYステートメントは1つのみです。
SET、MERGE、UPDATEのステートメントにリストされたデータセットは、BYステートメントにリストされている変数の値で並べ替えられているか、適切なインデックスを持つ必要があります。デフォルトでは、データセットは昇順の数値順またはアルファベット順で並べられていると判断されます。オブザベーションは次のいずれかの方法で配置されます。
  • データセットを並べ替える
  • 変数のインデックスを作成する
  • オブザベーションを順番に入力する
注: MODIFYステートメントではデータを並べ替える必要はありませんが、並べ替えを実行するとパフォーマンスを向上させることができます。
注: BYステートメントでは、SORTSEQ=LINGUISTICオプションが指定されたSORTプロシジャを使用して並べ替えたデータの言語照合が優先されます。
詳細については、XisError: No pubcode in link data found for lrconを参照してください。

PROCステップ

BYステートメントを一部のSASプロシジャで使用すると、そのSASプロシジャのアクションを変更することができます。BYステートメントがSASプロシジャの処理に与える影響については、 Base SASプロシジャガイドにある各プロシジャの説明を参照してください。

SASビュー

DBMSからの読み込み基づきDATAステップビューを作成する際、SET、MERGE、UPDATE、MODIFYの各ステートメントの後ろにBYステートメントが指定されている場合、BYステートメントではDBMS側でデータを並べ替えを行い、並べ替えたデータを返すことがあります。データの並べ替えが発生すると、実行時間が長くなります。

BYグループの処理

FIRST.変数とLAST.変数には、次の値が割り当てられます。
  • FIRST.変数は、次の場合に値が1に設定されます。
    • 現在のオブザベーションがデータセットから読み込む最初のオブザベーションである場合。
    • GROUPFORMATオプションを使用していないときに、現在のオブザベーションにある変数の内部値が前のオブザベーションにある内部値と異なる場合。
      GROUPFORMATオプションを使用しているとき、FIRST.変数が1に設定されるのは、現在のオブザベーションにある変数のフォーマット値が前のオブザベーションにあるフォーマット値と異なる場合です。
    • FIRST.変数が、BYステートメント内でその前にあるどの変数に対しても1に設定される場合。
      該当しない場合、FIRST.変数の値は0になります。
  • LAST.変数は、次の場合に値が1に設定されます。
    • 現在のオブザベーションがデータセットから読み込む最後のオブザベーションである場合。
    • GROUPFORMATオプションが使用されているときに、現在のオブザベーションにある変数の内部値が次のオブザベーションにある内部値と異なる場合。
      GROUPFORMATオプションが使用されている場合、LAST.変数が1に設定されるのは、現在のオブザベーションにある変数のフォーマット値が次のオブザベーションにあるフォーマット値と異なる場合です。
    • LAST.変数が、BYステートメント内でその前にあるどの変数に対しても1に設定される場合。
      該当しない場合、LAST.変数の値は0になります。

例1: BY変数の指定

  • オブザベーションはDEPT変数の昇順で並べられます。
    by dept;
  • オブザベーションはCITYのアルファベット順(昇順)で並べられます。CITYの値内では、ZIPCODEの昇順で並べられます。
    by city zipcode;

例2: 並べ替え順序の指定

  • オブザベーションはSALESREPの昇順で並べられます。SALESREPの値内では、JANSALESの値の降順で並べられます。
    by salesrep descending jansales;
  • オブザベーションはBEDROOMSの降順で並べられます。BEDROOMSの値内では、PRICEの値の降順で並べられます。
    by descending bedrooms descending price;

例3: 並べ替えを実行していないデータのBYグループ処理

オブザベーションは費用が発生した月の名前で並べられます。
by month notsorted;

例4: フォーマット値を用いてオブザベーションをグループ化する

次にGROUPFORMATオプションを使用例を示します。
proc format;
   value range
      low -55 = 'Under 55'
      55-60   = '55 to 60'
      60-65   = '60 to 65'
      65-70   = '65 to 70'
      other   = 'Over 70';
run;
proc sort data=sashelp.class out=sorted_class;
   by height;
run;
data _null_;
   format height range.;
   set sorted_class;
      by height groupformat;
   if first.height then
      put 'Shortest in ' height 'measures ' height:best12.;
run;
SAS Systemは次の出力をログに書き出します。
Shortest in Under 55 measures 51.3 Shortest in 55 to 60 measures 56.3 Shortest in 60 to 65 measures 62.5 Shortest in 65 to 70 measures 65.3 Shortest in Over 70 measures 72

例5: 複数のオブザベーションを結合した後で1つのBYの値を基にグループ化する

次の例では、BYグループの処理でFIRST.変数とLAST.変数を使用する方法を示します。
data Inventory;
   length RecordID 8 Invoice $ 30 ItemLine $ 50;
   infile datalines;
   input RecordID Invoice ItemLine &;
   drop RecordID;
   datalines;
A74  A5296  Highlighters
A75  A5296  Lot # 7603
A76  A5296  Yellow Blue Green
A77  A5296  24 per box
A78  A5297  Paper Clips
A79  A5297  Lot # 7423
A80  A5297  Small Medium Large
A81  A5298  Gluestick
A82  A5298  Lot # 4422
A83  A5298  New item
A84  A5299  Rubber bands
A85  A5299  Lot # 7892
A86  A5299  Wide width, Narrow width 
A87  A5299  1000 per box
;
data combined;                 
   array Line{4} $ 60 ;       
   retain Line1-Line4;
   keep Invoice Line1-Line4;
   set Inventory;
   by Invoice;  
                                       
   if first.Invoice then do;
      call missing(of Line1-Line4);
      records = 0;
   end;
                                        
   records + 1;
   Line[records]=ItemLine;       
                                        
   if last.Invoice then output;
run;                                     
proc print data=combined;
   title 'Office Supply Inventory';
run;
結合した複数のオブザベーションからの出力
結合した複数のオブザベーションからの出力

関連項目:

前のページ|次のページ|ページの先頭へ