本日は研究室でのSQL勉強会第2回でした。徐々にデータを扱う機会も増え、SQLにも慣れてきた気がします。今日学んだことを書いておきます。
computer05_businessman

<データには型がある>
・データベースに収納されているデータには型がある。
・vardher:可変長文字列。varchar(m)という形で指定する。mはバイト数。全て埋まらないでもいい。
・date:日付

<日付と日付の差を出す>
・where datediff (day, ef4, ef24)>=1:ef4とef24には日付が入っている。ef24からef4をひいて1日以上のものを抽出する文章。datediff (datepart, startdate, enddate)の順番で書く。datepartにはday以外にもyear, month, weekなどが入る。

<表の項目を追加する>
・select qhosp,ptid ,max (dtadm) as maxdate, min(dtadm) as mindate, count(1) as cnt
FROM #t1
group by qhosp, ptid order by cnt desc
・selectの後に既存の項目と共に書くことで新たな項目として入れることができる。名前はas以下に指定。

・avg(age) as mean_ageなどで平均値をつけることもできる。平均値を出すときは0でなくnullにする。0にするとその行も分母に入ってしまい平均値が変化する。整数のavgを出すと結果も整数になるので、小数点まで出すためにはstay+0.0とする。
・例:select outcome,
avg (case when sex= 1 then stay else null end) as male_stay_mean,
avg (case when sex= 2 then stay else null end) as female_stay_mean
FROM #t1
group by outcome order by outcome

・合計を出す時にはsum
sum (case when outcome =1 then 1 else 0 end) as out1

<データがかぶっている分を消去する>

・select distinct * from #t1:全ての項目が同じ行を消してカウントする。
・select distinct qhosp, ptid, dtadm from #t1:qhosp, ptid, dtadmの項目が全く同じものを消してカウントする。
・このdistinctはどのような項目があるのかを見るのにも使われる。

<2つのデータを結合する>
・select a.*, b.EF
from #y1 a
left  join #e1 b
on
a.qhosp = b.qhosp and
a.ptid =b.ef2 and
a.dtadm =b.ef4


・#y1と#e1を結合する。on以下が結合の条件。left joinはaをメインにbを結合する。aの症例数が基本になる。right joinは逆。inner joinでは重なったところだけ。
・データを結合するときは1行の単位を合わせる必要がある。入院単位、レセプト単位、患者単位などを合わせないとデータの数が増えてしまうことがある。また重複しているデータをdistinctしていく必要がある。
・つまり結合したときは症例数が変化していないか注意する必要がある。テーブルAとテーブルBをjoinで結合した場合、結合条件にあうデータがテーブルBに複数存在する場合、結果が複数になってしまい増えてしまう。
・表の項目は一番上の式のselect a.*, b.EF でaの全ての項目とbのEFとなる。

・1レセプトを1入院に整理する
select qhosp, ef2, ef4
into #tt1
from #t1
group by qhosp, ef2, ef4

・連結する前にありなしを見えるように項目を作る
select *, 'ari' as tPAumu into #tt2 from #tt1

<自習>
select  *  FROM #t1
where age >= 18
and
((dadm like 'I63%' and dadmnm not like '%疑%')
or ((dadm like 'I63%' and dadmnm like '%疑%')
and ((dmain like 'I63%' and dmainnm not like '%疑%') or (dres1 like 'I63%' and dres1nm not like '%疑%'))))