SAS

Proc sqlを極める(3) ーwhere句、order by句ー

proc sqlの第3回目です。今回はデータの抽出条件を指定するwhere句とデータをソートするorder by 句についてです。

where句

where句はselect句で選択したカラムから指定した条件式に合致したレコードを抽出します。
dataステップのwhereステートメントと同等の機能を実現します。条件式は一般的な論理演算子が使用できます。

between-and演算子

「between 数値1 and 数値2」と指定すると、数値1から数値2までの範囲内にあるレコードを選択します。

data test; 
input usubjid $ lbcat aval; 
cards; 
a01 1 1.1 
a01 2 1.4 
a01 3 24.1 
a01 4 2000 
b01 1 3.0 
b01 2 1.2 
b01 3 50 
b01 4 1800 
c02 1 3.2 
c02 2 0.5 
; 
run; 


proc sql; 
   select usubjid, 
          lbcat, 
          aval 
   from test 
   where lbcat between 3 and 4; 
quit;

上記の例ではlbcatが3から4のレコードを抽出しています。

contains演算子

containまたは「?」は直後に指定した文字列を対象カラムから検索し、一致したレコードを選択します。
対象カラムは文字列型である必要があります。

data test; 
input usubjid $ lbcat aval; 
cards; 
a01 1 1.1 
a01 2 1.4 
a02 1 24.1 
a02 2 2000 
b01 1 3.0 
b01 2 1.2 
b02 1 50 
b02 2 1800 
c02 1 3.2 
c02 2 0.5 
; 
run; 

proc sql; 
   select usubjid, 
          lbcat, 
          aval 
   from test 
   where usubjid contains "a"; 
quit;

上記の例ではusubjidに「a」を含むレコードを抽出しています。

in演算子

in演算子は指定したリストに含まれるいずれかの文字列に合致したレコードを選択します。

data test; 
input usubjid $ lbcat aval; 
cards; 
a01 1 1.1 
a01 2 1.4 
a02 1 24.1 
a02 2 2000 
b01 1 3.0 
b01 2 1.2 
b02 1 50 
b02 2 1800 
c02 1 3.2 
c02 2 0.5 ;
run; 

proc sql; 
   select usubjid, 
          lbcat, 
          aval 
   from test 
   where usubjid in ("a01", "a02"); 
quit;

上記の例ではusubjidがa01またはa02のレコードを抽出しています。

like演算子

like演算子は指定した文字列パターンに合致したレコードを選択します。
以下のワイルドカードが使用可能です。

  • %: 0文字以上の任意の文字列
  • _: 任意の1文字

grepなどで一般的に使用される正規表現は残念ながら使えないようです。

data test; 
input usubjid $ lbcat aval; 
cards; 
a01 1 1.1 
a11 2 1.4 
a02 1 24.1 
a12 2 2000 
b01 1 3.0 
b11 2 1.2 
b22 1 50 
b22 2 1800 
c32 1 3.2 
c52 2 0.5 
; 
run; 
proc sql; 
   select usubjid, 
          lbcat, 
          aval 
   from test 
   where usubjid like "a_2"; 
quit;

上記の例では、usubjidがパターン「a [任意の1文字] 2」に合致するレコードを抽出します。
すなわちa02とa12のレコードが抽出されます。

order by句

order by句は指定したカラムに基づいてレコードを並び替えます。SASプロシジャのproc sortと同等の処理を実行します。
sql上ではデータのマージや変数の作成などの処理と共に記述できるので、コードの量をSASプロシジャよりも若干減らせるのが利点です。

指定する変数の直後に「asc」を記述すると昇順、「desc」を記述すると降順に並び替えます。特に指定しない場合は昇順となります。

data test; 
input usubjid $ lbcat aval; 
cards; 
a01 1 1.1 
a11 2 1.4 
a02 1 24.1 
a12 2 2000 
b01 1 3.0 
b11 2 1.2 
b22 1 50 
b22 2 1800 
c32 1 3.2 
c52 2 0.5 
; 
run; 

proc sql; 
   select usubjid, 
          lbcat, 
          aval 
   from test 
   order by lbcat asc, aval desc; 
quit;