DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

様式1ファイルを扱ってみる(2)

<注> 今回のSQLPostgreSQL拡張機能を使います!Postgre以外では動きません!

今回は前回作った様式1データから、横持ちのデータを取り出してみます。
やってみたいのは、以下のようなデータ抽出です。

元データ

データ識別番号 連番 ペイロード9
001 1 心不全
001 2 肺炎
001 3 狭心症
001 4 心房細動

取り出すデータ

データ識別番号 病名1 病名2 病名3 病名4
001 心不全 肺炎 狭心症 心房細動


さて、どうしたものでしょうか。 ここでCASE式を活用したSQLを書けたら格好いいのですが、生憎上手く行かなかったので、PostgreSQL拡張機能を使うことにします。 まずは以下のコードを実行してください。

CREATE EXTENSION tablefunc;

ドキュメントはこちらです。
今回はこの中のcrosstab(text, text)関数を使います。 実際のSQLはこのようになります。

select *
from
crosstab('select データ識別番号,連番,ペイロード9
from ff1test
Where コード = ''A006040''',
'select m from generate_series(1,10) m')
AS(
データ識別番号 int,
病名1 text,
病名2 text,
病名3 text,
病名4 text,
病名5 text,
病名6 text,
病名7 text,
病名8 text,
病名9 text,
病名10 text);

…何が起きたのでしょうか。
半分ドキュメントからの引き写しですが、どうやら上手く行ったようです。
結果は

データ識別番号 病名1 病名2 病名3 病名4 —病名10
001 心不全 肺炎 狭心症 心房細動 —病名ラスト

のようになり、しかも(賢いことに)病名が10個も入っていない場合は、自動的にNULLが入ります。
確かに目的通りの結果ですが、今まで書いてきたSQLとは大分毛色が違うシロモノで、何が何だかわからないという人も多いでしょう。
(告白すると、私はドキュメントを前にしばらく頭を抱えていました)
次回はcrosstab関数の簡単な解説をしようと思います。