当前位置:首页 期刊杂志

基于SQL的医院病种和手术统计监测应用实例分析

时间:2024-07-28

杨业春

随着大数据时代的到来,结构型数据库成为医院信息储存的主要工具。卫生行政部门的监督指导愈加重视卫生统计数据的及时性和准确性,这在诸如三甲医院评审、高水平医院遴选、医改付费制度改革等工作中均可见一斑。卫生统计参与到卫生管理和行政决策,这对医院统计工作者提出了新的要求,及时、准确地提供管理部门所需的定期统计监测数据,同时开展数据挖掘辅助决策,成为新时代医院统计工作的机遇和挑战[1]。

广东省采用统一的病案首页,卫生管理部门对医疗机构评价时关注的统计指标大量涉及病案首页;定期监测意味着需要按月/季/年等形式重复统计。一般要基于病案首页数据进行分析统计,常规的做法是将原始记录导入到统计软件中进行;但随着首页信息量和病例样本量的递增,导出数据的过程非常耗时耗力,重复统计的过程更是低效繁琐。SQL(structured query language,SQL)即结构化查询语言,是用于关系型数据通讯的标准语言[2]。在广东省统一的病案统计管理系统中的“查询分析器”模块,能直接编写并保存SQL模块进行统计分析,结果直观地展示在查询分析器窗口,统计工作效率大幅度提高。同时,由于SQL的灵活性,可以根据不同的关注点和调研目的随时编写语句,展示特定条件下的原始记录,因此为医院统计工作中的数据审核及数据完善工作提供了一种快捷、灵活的工具。

1 原理与方法

SQL语言是用于关系型数据库的通讯工具,因此熟悉数据库及其之间的关系是应用SQL的前提。以广东省病案统计管理系统为例[3],常用的数据库主要有主信息表tpatientvisit,诊断表tdiagnose和手术表toperation:主信息表储存患者的基本信息,如性别、年龄等;诊断表储存患者的疾病诊断信息,包括疾病名称和国际疾病分类(international classification of diseases,ICD)等;手术表储存患者的手术信息,包括手术名称和手术码(ICD-9-CM-3)等。3个数据库是通过病案号(fprn)和住院次数(ftimes)产生关联。在医院统计工作中运用SQL,除了要掌握SQL语句及其函数的用途和适用条件,还要理解数据统计口径、源数据字段、源字段代码的含义等,才能获得准确的统计数据结果,提高统计工作效率。

2 实例分析

2.1 病种的统计监测

以《三甲综合医院评审》中的18种住院重点病种中“急性心肌梗死”病种2017年的统计监测数据为例[4]。统计口径:按每季度、每年监测年龄≥18岁的急性心肌梗死(主要诊断ICD为I21-I22)住院患者的总例数、死亡例数、平均住院日与平均住院费用。SQL语句如下:

select count(a.fprn) 例数,

sum(case when a.flyfsbh=‘5’ then 1 else 0 end) 死亡例数,

cast(avg(cast(a.fdays as float)) as decimal(20,2)) 平均住院日,

cast(avg(cast(fsum1 as float)) as decimal(20,2)) 平均住院费用

from tpatientvisit a left join tdiagnose b on a.fprn = b.fprn and a.ftimes=b.ftimes

where a.fcydate>=‘20170101’ and a.fcydate<‘20180101’

and left(a.fage,1)=‘Y’ and (cast(substring(a.fage,2,3) as float))>=‘18’

and (b.ficdm like ‘I21%’ or b.ficdm like ‘I22%’ ) and b.fzdlx=‘1’

由于18个住院病种的ICD码要求各不相同,ICD的值域范围各有特点,因此对应的SQL查询统计各异,将其归纳为表1所示的6大类。

表1 18种住院重点病种的疾病ICD码归类及SQL条件设置语句

2.2 手术的统计监测

以《三甲综合医院评审》中的18种住院重点手术中“阴道分娩术”2017年的统计监测数据为例[4]。统计口径:按每季度、每年监测年龄≥18岁的“阴道分娩”手术出院患者的总例数、死亡例数、平均住院日与平均住院费用。“阴道分娩”病例定义为ICD-9-CM-3:72;73.0-73.2;73.4-73.9同时伴ICD为Z37。SQL语句如下:

select count(d.fprn) 例数,

sum(case when d.flyfsbh in (‘5’) then 1 else 0 end) 死亡例数,

cast(avg(cast(d.fdays as float)) as decimal(20,2)) 平均住院日,

cast(avg(cast(d.fsum1 as float)) as decimal(20,2)) 平均住院费用

from (select distinct a.fprn,a.ftimes,a.flyfsbh,

a.fdays,a.fsum1

from tpatientvisit a,toperation b,tdiagnose c

where a.fprn = b.fprn and a.ftimes=b. ftimes and a.fprn = c.fprn and a.ftimes=c.ftimes

and a.fcydate>=‘20170101’ and a.fcydate<‘20180101’

and left(a.fage,1)=‘Y’ and(cast(substring(a.fage,2,3) as float))>=‘18’

and ((substring(b.fopcode,1,4) in (‘73.0’,‘73.1’,‘73.2’,‘73.4’,‘73.5’,‘73.6’,‘73.7’,‘73.8’,‘73.9’))

or (b.fopcode like ‘72%’)) and substring(c.ficdm,1,3)=‘Z37’)as d

本例同时涉及病种和手术,新建数据子集d,它将符合时间段内(2017年),年龄≥18岁相应诊断和手术的病例筛选出来。“distinct”将同一次住院的多条手术记录剔除,仅保留一条用于统计指标的计算。该实例通过病案号和次数关联了3个数据库,包括主信息库、诊断库和手术库,分别用a、b和c代替它们。如表2所示,归纳了18种住院重点手术的SQL主要语句的差异。

表2 18种住院重点手术的ICD-9-CM-3码归类及SQL条件语句差异

2.3 疾病谱和手术谱的统计监测

以ICD码前3位作为病种归类的统计口径,可以运用SQL语句产生住院疾病谱:

select substring(b.ficdm,1,3) 疾病编码,

count(b.fprn) 病例数

from tpatientvisit a left join tdiagnose b on a.fprn = b.fprn and a.ftimes=b. ftimes

where a.fcydate>=‘20170101’ and a.fcydate<‘20180101’ and b.fzdlx=‘1’

group by substring(b.ficdm,1,3)

order by count(b.fprn) desc

同样原理,可以运用SQL语句产生住院手术谱,只需要将诊断库中ICD码的设置为手术库中相应的手术码即可。

3 讨论

3.1 SQL应用于医院统计的优劣势

随着计算机互联网渗透到医疗行业的方方面面,基于大数据的精细化管理成为现代化卫生事业管理的基本需求,统计监测和统计辅助决策在医院内部管理和卫生行政部门的监督过程中扮演越来越重要的角色。卫生统计监测已经在卫生行政部门的监管行为和医院内部的定期绩效考核评价中逐步实现。不管是上级部门的监管指标还是医院内部的管理考核需求,统计数据指标一段时期内相对固定。一般传统的统计方式是在病案统计管理系统中查询原始的数据记录,通过Excel的形式导出数据,而后通过其他的统计软件对导出的数据进行分析操作。这种方法的一个显著缺陷是原始记录的导出时间较长,同时导出过程中可能造成数据格式等错误;另一方面,相对固定的统计监测指标在每月/季/年均需要重复导出和重复统计操作,耗时耗力。SQL在病案统计管理软件中直接编写和运行结果,省略了数据导出过程,避免了原始数据传送过程中的错误;同时形成的SQL语句查询统计模板,只须稍作修改(如日期和科室等)即可直接输出所需的统计监测指标,减少了重复性的统计操作,大大提高了统计工作效率[5-6]。其次,SQL语句的编写灵活性高,数据提取速度快,能根据分析目的随时展示不同的统计结果,因此非常适合在日常医院统计工作中使用,能随时根据医院管理的需求提供统计数据的参考,辅助决策。

由于SQL在数据库中直接运用,能直接显示原始数据的基本情况,因此对于快速发现原始数据中的漏项、逻辑错误,查询某些符合特殊条件的记录等是非常有效的一种工具。因此对于病案首页数据质量的核查、数据审核和数据清理等,能发挥一定的作用。

SQL又称为结构化查询语言,它的主要功能在于查询符合条件的数据库记录。医院统计工作者借助该语言进行统计时,是采用了其基本的函数及条件设置语句,当统计指标较为简单诸如例数、平均数时,SQL能完全满足使用要求;但由于SQL自身的局限性,对于较为复杂的统计指标或者涉及统计模型、统计方程时,SQL无能为力,仍需借助专业的统计软件和程序。因此,SQL更适用于统计监测、数据核查和清理及初步的数据挖掘。

3.2 应用SQL的注意事项

SQL中的语法虽然简单易学,但必须熟练掌握每个语句和函数的适用条件和特点,才能正确运用,保障数据的准确性[7-8]。如实例1中“between…and…”语句,其特点是“边界包含”,如2017年间应写为“fcydate between ‘20170101’ and ‘20171231’”;而直接用不等符号设置条件时,应写为“fcydate>=‘20170101’ and fcydate<‘20180101’”。又如平均数函数Avg,它的适用条件前提是数值型数据,但病案首页数据库中,“天数(fdays)”是字符型数据,因此首先用cast函数将其转换为数值型数据方能进行计算。

同时,统计人员还必须根据源字段的值域范围及语句适用前提甄别采用的SQL语句是否恰当。如实例1中第4类和第5类病种查询的SQL语句,虽然都是查询ICD码范围,但第5类查询采用了“substring”语句而第6类查询采用了“between…and…”语句。这是由于ICD码值域的复杂性决定的:ICD码J12-J16的范围内不仅包含数字[9-10],还包含字母(J13.x00,J14.x00),若使用“between…and…”语句,则包含字母的记录不能被识别并筛选出来,从而造成统计数据的错误;而K25-K28中的ICD码仅包含数字形式,因此可以直接采用“between…and…”进行筛选统计。

在住院病种和手术监测指标的统计过程中,对统计口径的理解是前提和基础。不同的统计口径,决定了不同的SQL语句模块。如对住院18种重点手术的统计中,同一个病例同一次住院,有2个以上的手术码符合某一特定手术的条件,仅统计为一例,因此SQL语句中需要加上“distinct”以删除重复记录;又如ICD码和ICD-9-CM-3手术码的截取位数(类目?第一位亚目?)要根据研究目的确定,截取的位数不同对病种排序结果影响显著,有时甚至出现相反的结果。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!