医療機関テーブルには二次医療圏コードが存在しない.そのため,ある医療機関がどの二次医療圏に属しているかを調べるには空間データを調べる必要がある.空間データは計算コストが高く,テーブルの結合条件に STWIthin() メソッドを使うのは時間がかかる.そのため,医療機関テーブルに二次医療圏コードを追加しようと考えた.
最初に医療機関テーブルと二次医療圏テーブルを結合する
最初に考えたクエリは次の通り.実行には40分以上かかる.
USE MedicalAreaDB GO SELECT I.* , M.A38b_003 FROM [dbo].[T_Medical_Institution] AS I INNER JOIN dbo.T_MedicalArea2_Dissolved AS M ON I.Location.STWithin(M.geog) = 1
(181309 行処理されました)
次に医療機関テーブルに二次医療圏コード列を追加する
医療機関テーブルである T_Medical_Institute に対し,SQL Server Management Studio のオブジェクトエクスプローラー上で右クリックし,「デザイン」を選ぶ.
下図のように列名に SecondaryMedicalAreaCode とタイプし,データ型を nchar(4) とする.
クエリウィンドウを閉じると保存するよう促されるので「はい」をクリックする.
さらにクエリでUPDATEする
下記クエリで医療機関テーブル T_Medical_Institute を更新する.実行には43分かかった.
USE MedicalAreaDB GO UPDATE I SET SecondaryMedicalAreaCode = M.A38b_003 FROM [dbo].[T_Medical_Institution] AS I INNER JOIN dbo.T_MedicalArea2_Dissolved AS M ON I.Location.STWithin(M.geog) = 1
(181309 行処理されました)
結合条件を変更して結果を確認
下記クエリのように結合条件に二次医療圏コードを使用して実行する.実行には1秒かかったのみ.効果は劇的である.
USE MedicalAreaDB GO SELECT I.* , M.A38b_003 FROM [dbo].[T_Medical_Institution] AS I INNER JOIN dbo.T_MedicalArea2_Dissolved AS M ON I.SecondaryMedicalAreaCode = M.A38b_003
ポリゴンを融合した二次医療圏テーブルを元のテーブルと比較する
以前の記事(国土数値情報の医療圏データの文字化けを解決する)では二次医療圏のポリゴンに重複があるのではないかと仮定してジオメトリ数とポイント数の分布を示したが,決定的な証拠とはならなかった.今回はもう少し踏み込んだ議論をしてみたい.
下記のクエリはポリゴンを融合した二次医療圏テーブル T_MedicalArea2_Dissobled と元のテーブル A38-20_2 を結合し,両者の持つ Point の総数を比較するものである.
SELECT D.A38b_003 , D.geog.STNumPoints() AS DissobledNum , SUM(A.geog.STNumPoints()) AS IndividualNum FROM dbo.T_MedicalArea2_Dissolved AS D INNER JOIN dbo.[A38-20_2] AS A ON D.A38b_003 = A.A38b_003 GROUP BY D.A38b_003, D.geog.STNumPoints()
結果を散布図に示す.
ほぼ一直線上に点が並んでいる.ポリゴンに重複はなく,国土の複雑さゆえにポリゴン数が多いのであることがほぼ確定的である.
まとめ
医療機関テーブルに二次医療圏コードを追加した.空間演算による結合と比較して,二次医療圏コードによる結合は結合にかかる計算効率が非常に高い.
国土交通省におかれては,医療機関テーブルに最初から二次医療圏コードを付与しておいていただきたい.
ところで一時医療圏テーブルには一次医療圏コードが存在しない.行政区域コードがその代替なのだろうか.だとすると行政区域コードで一時医療圏テーブルを集約することも可能となる.これについては次の課題としたい.