proc sqlの第4回目です。今回はサブクエリについて。
サブクエリとは
クエリは入れ子にして書くことができます。
内側のクエリでデータを抽出し、外側のクエリはその抽出結果を取得してクエリを実行することができます。
この内側のクエリがサブクエリと呼ばれるものです。
使用例
例1
例えばデータセット2からデータセット1に含まれる症例番号に合致するレコードを抽出する場合を考えます。
データセット1
Obs | usubjid | lbcat | aval |
---|---|---|---|
1 | a01 | 1 | 1.1 |
2 | a11 | 2 | 1.4 |
3 | a02 | 1 | 24.1 |
4 | a12 | 2 | 2000.0 |
5 | b01 | 1 | 3.0 |
6 | b11 | 2 | 1.2 |
7 | b22 | 1 | 50.0 |
8 | b22 | 2 | 1800.0 |
9 | c32 | 1 | 3.2 |
10 | c52 | 2 | 0.5 |
データセット2
Obs | usubjid | subgroup | score |
---|---|---|---|
1 | a01 | 1 | 5 |
2 | a14 | 2 | 4 |
3 | a23 | 1 | 9 |
4 | a40 | 2 | 1 |
5 | b07 | 1 | 2 |
6 | b11 | 2 | 6 |
7 | b29 | 1 | 7 |
8 | b83 | 2 | 8 |
9 | c38 | 1 | 3 |
10 | c52 | 2 | 8 |
SASだとこう書きます。
一度2つのデータセットをマージしinオプションで両方のデータセットに含まれるレコードを抽出します。
proc sort data=ds1; by usubjid;
run;
proc sort data=ds2; by usubjid;
run;
data result;
merge ds1(in=a keep=usubjid) ds2(in=b );
by usubjid;
if a and b;
run;
proc sqlだとこうなります。
proc sql;
create table result2 as
select * from ds2
where usubjid in (select usubjid from ds1);
quit;
where句のカッコの中がサブクエリです。サブクエリでデータセット1のusubjidを取得し、where句でデータセット2のusubjidと比較しているわけです。
さらにデータセット1の症例のうちlbcat=2となる症例と合致するレコードを、データセット2から抽出する場合はこうなります。
proc sql;
create table result2 as
select *
from ds2
where usubjid in (
select usubjid
from ds1
where lbcat=2);
quit;
ソートだけならSASでも同様の処理はできるので積極的にSQLで置き換えるメリットは乏しいですが、今回のケースのように別テーブルに含まれる症例のレコードを抽出する場合は、SQLのほうが直感的に書けると思います。