ラベル SQL: DISTINCT の投稿を表示しています。 すべての投稿を表示
ラベル SQL: DISTINCT の投稿を表示しています。 すべての投稿を表示

2015年8月27日木曜日

SQLプロシジャのDISTINCTを使ったグループ毎のカウント。




SQLプロシジャのDISTINCTについては、「有害事象の発現例数と件数を簡単に出す。」で紹介済みですが、まだまだ魅力が伝わりきってないので再度紹介したいと思います。



サンプルデータ

data DT1;
input CUST_ID$ NAME$ FOOD$;
cards;
001 James BREAD
001 James CANDY
002 Alice BREAD
002 Alice CANDY
002 Alice CANDY
;

 CUST_ID 
 NAME 
 FOOD 
 001
 James
 BREAD 
 001
 James
 CANDY
 002
 Alice
 BREAD
 002
 Alice
 CANDY
 002
 Alice
 CANDY


サンプルは、顧客ID(CUST_ID)で管理されたお客さん(NAME)が購入した食べ物(FOOD)を記録したデータだとします。



やりたい事

このデータから、以下の集計をしたい。
↓↓食べ物(FOOD)毎の「購入者数(C1)」と「購入者の全購入数(C2)」

 FOOD 
 C1 
 C2 
 BREAD 
  2 
  2
 CANDY
  2
  3



こういった集計は、SQLのDISTINCTを使えば一発です。

proc sql;
  create table OUT1 as
  select  FOOD,
             count( distinct CUST_ID ) as C1,
             count( CUST_ID ) as C2
  from DT1
  group by FOOD;
quit;



簡単に解説

  • SQLのCOUNT関数: 引数が非欠損値のレコード数を求める
  • DISTINCT: 関数の中に指定すると、引数の値から重複を除いたレコードを計算対象とする


つまり、食べ物(FOOD)毎に以下を求めています。
  • count( distinct CUST_ID ): CUST_IDの値から重複を除いた非欠損値の数 = 購入者の人数
  • count( CUST_ID ): CUST_IDが非欠損値の数 = 購入者の全購入数


2013年11月15日金曜日

有害事象の発現例数と件数を簡単に出す。


安全性の解析で出てくる有害事象の集計。
例数と件数をなるべく簡単に少ないステップで出したい。
SQLなら簡単にできてしまう。


* サンプルデータ ;
data AE;
  length SUBJID $3. AETERM $20. AESTDT 8.;
  input SUBJID$ AETERM$ AESTDT;
  informat AESTDT yymmdd10.;
  format AESTDT yymmdds10.;
cards;
001 RBC上昇 2012/01/02
001 WBC減少 2212/02/05
002 RBC上昇 2012/01/05
002 WBC減少 2012/01/05
003 WBC減少 2012/02/10
;
run;












このデータから以下のように有害事象の発現例数・件数を出したい。
(症例内で同じ事象が複数回発現してる場合の扱いとかは、今回の例では特に考えてないです)





* SQLで発現例数と件数を1STEPで出す ;
proc sql;
  create table AE_N as
  select count( distinct SUBJID ) as N1,
             count( SUBJID ) as N2
  from AE;
quit;


N1が例数、N2が件数を求めた結果。



簡単に解説
  • SQLのCOUNT関数: 引数が非欠損値のレコード数を求める
  • DISTINCT: 関数の中に指定すると、引数の値から重複を除いたレコードを計算対象とする

今回の例だと「count( distinct SUBJID )」で、SUBJIDの値から重複を除いた非欠損値のレコード数を求めています(=例数が求まる)