周哲穎 史佳敏 黃 銳
同濟大學附屬第一婦嬰保健院,200125 上海
大數據背景下的醫院管理中,統計工作除了執行國家衛生統計報表制度外,各種科研、質量、管理數據等精細化需求,均需要統計人員更多地致力于數據查詢與數據挖掘工作[1]。病案首頁數據整合了病人的基本信息、住院過程信息、診療信息和費用信息,是醫院考核的重要依據。在填寫病案首頁數據時,設定了統一的代碼和填寫要求,由此形成的首頁數據庫經過層層質控標準監測,其數據在精準性、客觀性、應用性上更勝于其他信息系統。某醫院是一所三甲婦產科專科醫院,年分娩量位列當地全市第一。該院病案首頁數據除了依據國家衛生健康委員會頒布的2013版病案首頁數據標準外,還根據醫院專業特色增加產科的一些過程變量和結局變量,形成了一對多的數據表結構分布。由于病案統計軟件自帶的統計查詢功能,只能接受簡單的查詢條件,在查詢的自由度、效率上不能完全滿足醫院龐大的數據需求[2],數據深層檢索必須依靠結構化查詢語言(structured query language,SQL)語言編寫查詢語句,才能兼顧實現醫院數據大、快、準的統計要求。
某醫院病案統計軟件是基于.Net平臺面向服務對象進行3層構架模式,Client—Application—Database,數據庫采用SQL Server 2008,客戶端使C# 語言編寫,開發工具為Microsoft visual studio 2010 。其基本數據表架構有6大核心數據表和各類代碼表構成。
(1)患者基本信息表(tbt_patient_base):包括病人本次住院id、住院號、姓名、入院日期、出院日期、住院科別、門急診診斷、醫療組別等。
(2)患者診斷信息表(tbt_ patient _icde):包括本次住院id、診斷編碼、診斷名稱、入院時情況、疾病轉歸等。
(3)患者手術信息表(tbt_ patient _icpm):包括本次住院id、手術時間、手術編碼、手術名稱、切口愈合等級、麻醉方式、手術醫生等。
(4)孕產信息表(tbt_patient_preg):包括本次住院id、孕周、出血、胎次、產次等。
(5)分娩信息表(tbt_patient_baby):包括本次住院id、分娩時間、分娩胎數、新生兒體質量、身長、評分、分娩結局(活/死)、分娩方式等。
(6)費用信息表(tbt_patient_cost):包括本次住院id、總費用、診療費、護理費、檢查費、治療費、手術費、藥費、耗材費等16種首頁涵蓋的費用類別與其子費用。
患者信息匯總表(tbt_patient_info),匯總了一個出院病人的基本信息、診斷信息(前7個)、手術信息(前5個)、孕產婦信息、分娩信息(本次住院分娩第1胎信息)、費用信息。
此外,該院住院號的管理模式采用每人在各院區使用唯一住院號的模式。在設計數據庫之初約定,病人每次住院使用同一個住院號,但每次住院時后臺也會自動分配給病人一個id,不同的住院時間id不同,但住院號相同。
由于病案統計系統的設計限制,在系統自帶的查詢功能里,無法實現一對多的統計檢索。例如一個病人本次分娩雙胎或多胎的情況下,系統自帶的統計查詢只能顯示第1個孩子的信息,因此要查詢2020年的所有圍產兒的分娩量及其信息(單胎+多胎),此時就需要利用SQL語句查詢,完成所有圍產兒的信息統計。圍產兒是指孕周大于等于28周的分娩胎兒,包括活產和死胎。查詢語句如下:
SELECT A.patno,A.patname,b.babyweight,
b.babysex,b.babyagp,b.babydate
FROM Tbt_patient_info A, Tbt_patient_baby B
WHERE A.id=B.id
and year(A.outdate)=′2020′
and A. gestation >=28
語句的第1句是顯示產婦的住院號patno、姓名patname、新生兒體質量babyweight、新生兒性別 babysex、AGP評分 babyagp、新生兒出生時間 babydate。第2句用到SQL最常用、最基本的關聯語法:將患者信息匯總表Tbt_patient_info和分娩信息表Tbt_patient_baby用本次住院的id相關聯,查詢條件是孕周(gestation)≥28周并且出院時間是2020年。
根據上述介紹的表結構,表Tbt_patient_info里只記錄母親的部分信息和本次分娩的第1胎信息,如果僅用到Tbt_patient_info表,則只能顯示2020年所有產婦及其分娩的第1條信息。如果產婦本次分娩了雙胞胎,則也僅顯示產婦本次分娩的其中一胎信息,缺失了本次分娩的2胎及以上的信息。因此必須關聯Tbt_patient_baby表(Tbt_patient_baby記錄了分娩產婦的所有胎兒信息),加上關聯條件A.id=B.id,可獲得所有的28周及其以上的圍產兒信息。
在醫院科研工作中,常常需要調閱一些同時伴隨癥的病歷。以調閱2020年診斷同時伴有重度子癇前期和妊娠糖尿病的病人為例,如果在系統自帶的查詢界面上設定查詢條件為診斷編碼“O14.1(重度子癇前期)并且 O24(妊娠糖尿病)”,則查詢的結果為0;若查詢條件改為“O14.1 或者 O24”,則輸出的結果為重度子癇前期病人或妊娠期糖尿病病人。針對這樣的結果,只有導出查詢結果,然后取住院號和出院日期相同的重疊記錄,才能統計出同時患有指定2種疾病的病人人數。這種方法需要花更多的時間進行二次人工篩選,在效率和準確性上不及SQL的語言查詢:
select A.patno,patname ,icdename11,a. icdename 21,a icdename 22,a. icdename 23,a. icdename 24
from Tbt_patient_info a,Tbt_patient_icde b
where a.id=b.id
and YEAR(a.outdate)=′2020′
and b.Icdecode like ′O14.1%′
and a.id in
(select id from T_dmr_patient_icde where left(icdecode,3)=′O24′)
這是一個嵌套語句,首先選定患者信息匯總表Tbt_patient_info和患者診斷信息表Tbt_patient_icde。選定Tbt_patient_info是為了顯示患者的住院號、姓名、主要診斷、其他診斷等患者基本信息,其中Tbt_patient_info中橫向記錄了患者的1個主要診斷和6個其他診斷。但由于每個病人的情況不同,在診斷中無法確定某個診斷(例如本例中的重度子癇前期O14.1)在第幾順序診斷上:既有可能在主要診斷(icdename11),也有可能在其他診斷1(icdename21)或者其他診斷2(icdename22)或第N個診斷上。因此在這種情況下引入患者診斷信息表Tbt_patient_icde。根據上述表結構介紹可知Tbt_patient_icde表中診斷編碼和診斷名稱的變量只有1個,多個診斷是垂直縱向記錄的,可以相對固定診斷編碼變量。診斷數據記錄方式見表1和表2。

表1 患者信息匯總表Tbt_patient_info 診斷記錄方式

表2 患者診斷信息表Tbt_patient_icde診斷記錄方式
在選定好數據表、確定好相關變量后,即可編寫第1步查詢語句:
Select A.id,A.patno,A.patname, A.icdename11,A icdename 21,A. icdename 22,A icdename 23,A icdename 24
from Tbt_patient_info a,Tbt_patient_icde b
where a.id=b.id
and YEAR(a.OutDate)=′2020′
and b.IcdeCode like ′O14.1%′
第1步查詢Tbt_patient_info表中出院日期是2020年并且Tbt_patient_icde表里疾病編碼模糊匹配是′O14.1′(這里使用b.IcdeCode like ′O14.1%′,由于重度子癇前期有3個編碼和診斷,分別是O14.100、O14.101、O14.102,我們可以統一寫成 like ′O14.1%′)。同樣2個表用id關聯,即a.id=b.id。
第2步查詢語句是在第一步查詢基礎上增加:
and a.id in
(select id from T_dmr_patient_icde where left(icdecode,3)=′O24′)
語意是:在查詢出2020年診斷為重度子癇前期的這些病人中,通過這些病人的id繼續在病人診斷信息表中搜索出同一個id里存在妊娠期糖尿病(O24)診斷的出院病人。即先確定重度子癇前期的人群,再在這個人群中繼續搜索有糖尿病的人。通過這樣2步的查詢,就可以獲得同時患有2種指定疾病的患者人數和相關信息。
重返率是目前醫院質量安全的重要監測指標[3],以31 d非計劃再入院指標為例,如果從系統自帶的界面查詢,查詢條件基本無法給定;若依靠平時制度約定的上報記錄進行人工檢索,花費時間久,而且存在一定比例的漏報現象。但是通過SQL關聯性數據查詢,就能實現快速鎖定統計范圍:
select a.patno 住院號,a.patname 病人姓名,b.outdate 前次出院日期, c.indate 后次入院時間,DATEDIFF(dd,b.outdate,c.InDate) 間隔時間,b.IcdeName11 前次診斷,b.opername1 前次手術,b.OperName2 前次手術,b.OperName3 前次手術,c.icdename11 后次診斷,c.opername1 后次手術,c.OperName2 后次手術,c.OperName3 后次手術
from T_dmr_card_base A, T_dmr_card_info b,T_dmr_card_info c ---b是前次,C是后次
where a.id=b.id
and YEAR(a.OutDate)=′2020′
and b.id<>C.id
and b.PatNo=c.PatNo
and c.PatNumb=b.PatNumb+1
and b.againplan=’2’
and DATEDIFF(dd,b.outdate,c.InDate)<=31
本例引入了2個表,分別是患者基本信息表tbt_patient_base、患者信息匯總表tbt_patient_info,其中tbt_patient_info 在本實例里引入2次,分別代表B區的前次信息和C區的后次信息。通過B區信息和C區信息的平行比較,在條件中加入關鍵變量住院次數(Patnumb)就可以獲得同一個病人多次住院的記錄。其中關鍵條件解讀如下:
① b.id<>C.id and a.PatNo=c.PatNo 表示前一次住院的ID不等于后次住院的ID,但前一次住院和后一次住院是采用同一個住院號(在前文已經闡述該院管理病案號的模式);
② c.PatNumb=b.PatNumb+1 表示后一次的住院次數=前一次住院次數+1;
③ b.againplan=’2’ 表示前一次住院的再入院計劃為‘否’;
④ and DATEDIFF(dd,b.outdate,c.InDate)<=31 表示前次出院日期后后次入院日期間隔日期<=31 d。
從第1句select中,我們除了調取病人的基本信息,更多的是調取病人前次診斷和手術和后次入院的診斷和手術,以及2次相鄰入院的時間間隔天數。通過這樣的語句可以將前后2次住院的情況清楚地顯現出來,從而可以看出前后的診療是否具有延續性,即計劃內的。比如在婦產科中,葡萄胎在31 d內的再入院治療是屬于正常計劃內的。又如分娩后31 d內再入院,后次診斷是胎盤粘連,手術是清宮術則屬于非計劃內的。通過這樣的查詢均可以完整地羅列出來各種非計劃再入院的情況。
母-嬰的疾病關系是婦產科醫院一項重要的管理研究內容。從目前的數據庫結構上,可以通過界面查詢的是母親情況和出生孩子的體質量、身長、評分的關系,但想進一步查詢孩子具體的某一疾病和母親孕產期疾病與處置關系時,則還是需要通過SQL的關聯性數據查詢,進行一個范圍的確定,再進行病歷討論和質量評估。
例如,醫院需要對診斷為“新生兒缺氧缺血性腦病”的病例進行母親孕產期管理的回顧性分析,就需要查詢孩子診斷編碼為P91.600,其母親的疾病史、手術史、孕產期情況。具體語句如下:
select distinct A.patno 母親住院號, A.patname 母親姓名, A.outdate 母親出院日期, A.outdays 母親住院天數,A.deptname 母親出院科室,A.icdename11 母親主要診斷,icdename21 母親其他診斷1,A. icdename22 母親其他診斷2,A. icdename23 母親其他診斷3, A icdename24 母親其他診斷4,A. icdename25 母親其他診斷5,A.icpmname1母親手術1, A icpmname 2母親手術2, A. icpmname3 母親手術3, A. icpmname 4 母親手術4, A. icpmname5 母親手術5
from Tbt_patient_info A , Tbt_patient_base B, Tbt_patient_icde C
where b.outdate>=′2015-01-01′and b.outdate<′2021-01-01′
AND C.icdecode=′P91.600′
AND B.id=C.id
AND RIGHT(A.patno,6)=SUBSTRING(B.patno,4,6)
本例我們邏輯假定孩子相關住院信息表和診斷表為Tbt_patient_base、Tbt_patient_icde,母親的相關住院信息表為Tbt_patient_info。因此設Tbt_patient_info 為A,從A區中羅列出母親的基本信息包括基本信息、住院時間、住院科室、相關疾病、相關手術等。
羅列好母親信息后,再將孩子限定條件編寫出來:即從Tbt_patient_icde搜索出診斷編碼為′P91.600′,從Tbt_patient_base限定孩子出院時間是2015—2020年,語句為:
from Tbt_patient_base B, Tbt_patient_icde C
where b.outdate>=′2015-01-01′and b.outdate<′2021-01-01′
AND C.icdecode=′P91.600′
AND B.id=C.id。
最后將母親的住院號和孩子的住院號關聯起來。這里不能用id,因為id是針對同一個對象的,不同對象的id沒有關聯性。但該院的母嬰住院號之間是有一定規律的,即母親住院號的后6位與其孩子住院號的第4至第9位是相同的。通過母嬰住院號關聯的語句為:
RIGHT(A.patno,6)=SUBSTRING (B.patno,4,6)。
通過這樣的SQL語句搜索就可以獲得孩子診斷編碼為P91.600的相關母親歷次住院情況。數據表邏輯見圖1。

圖1 母-嬰關系數據表邏輯圖
SQL結構化的查詢語句,作為統計使用的數據查詢語言是最常用的功能,通過select —from—where—group by—order by等結構語句可以快速地將不同的數據表內數以萬計的記錄通過某個條件和表間的共同索引構建組成一個新的查詢結果[4]。
研究通過實例分析,展示了SQL在解決不同對象,相同對象不同時間、空間之間的關系查詢。相對于固有的報表統計軟件,其數據高度自由結合性能在統計工作中起到了極大的輔助作用,其中熟悉數據庫架構關系和語言表達邏輯是掌握該技能的關鍵[5]。首先要充分了解系統后臺的數據表結構及結構關系,在檢索時能快速反應出所用數據表。其次掌握SQL的邏輯關系與表達方式,在查詢之初能構建出較明確的E-R(實體-聯系)模型,并能將E-R模型進行數據語言的轉換,可以方便地實現不同主體數據的關系構建。本文始終使用SQL最基本的select語言,而未用union是為了方便讀者進行體會。
使用結構化的查詢語句是大數據時代的必備技能,隨著DRGs的推廣、國家與地市的三級公立醫院績效考核的相繼推出,對醫院的質量要求和管理要求提上了一個新層次。毋庸置疑,數據是醫院考核的重要依據,而多元化的數據需求也是新時代醫院管理統計服務工作必須面對的新挑戰[6]。統計人員應該加強自身業務學習,將工作經驗和數據技能相結合,以促進職業綜合素質的提高。