例えば
data Q1;
TEAM='A';ID='aさん';VAL=90;output;
TEAM='A';ID='bさん';VAL=35;output;
TEAM='A';ID='cさん';VAL=42;output;
TEAM='A';ID='dさん';VAL=56;output;
TEAM='A';ID='eさん';VAL=68;output;
TEAM='B';ID='fさん';VAL=40;output;
TEAM='B';ID='gさん';VAL=58;output;
TEAM='B';ID='hさん';VAL=62;output;
TEAM='B';ID='iさん';VAL=52;output;
TEAM='B';ID='jさん';VAL=68;output;
TEAM='C';ID='kさん';VAL=90;output;
TEAM='C';ID='lさん';VAL=88;output;
TEAM='C';ID='mさん';VAL=62;output;
TEAM='C';ID='nさん';VAL=32;output;
TEAM='C';ID='oさん';VAL=38;output;
run;
のようなデータがあったとします。
A B Cの3チームで、チーム内には複数のメンバーがいて変数VALには何らかの得点が
入っているとします。
ここで、チームの70%以上のメンバーが50点以上の得点であるグループのTEAMを抽出して
データセットにしたいとします。
さて、どうしますか?
if VAL>=50 then FL=1;とかデータステップで一度付与してからfreqなんかで集計するのも手ですが、この手の問題については、やはりべらぼうにSQLが強いです。集合指向言語の肩書は伊達じゃないです。
つまり
proc sql ;
create table A1 as
select TEAM
from Q1
group by TEAM
having count(*)*0.7<=sum(case when VAL>=50 then 1 else 0 end);
quit;
で詰んでるんですね。
【追記】
しまった!真偽ルールを使えば
proc sql ;
create table A1 as
select TEAM
from Q1
group by TEAM
having count(*)*0.7<=sum(VAL>=50);
quit;
これでいけるんだった。くそっ
0 件のコメント:
コメントを投稿