文章 Kelly Huang · 1 小时 前 5m read

FHIR SQL Builder 如何助力实时再入院风险评分

在开始开发“智能出院导航器(Smart Discharge Navigator)”时,我遇到了一个常见的难题:FHIR 数据以 JSON 数据包的形式存储,但我所需的分析需要将多个资源进行关联,而这正是 SQL 所擅长的领域。

InterSystems FHIR SQL Builder 彻底解决了这一问题。我无需在应用程序代码中解析 JSON 数据包,而是能够直接在 IRIS for Health 中针对 FHIR 资源投影编写纯 SQL 语句。本文将详细介绍我如何利用该工具构建了该应用程序核心——基于人群的再入院风险评分引擎。


临床问题

30 天内的医院再入院是医疗保健领域成本最高且本可预防的问题之一,每年给美国医疗系统造成 170 亿美元的损失。挑战并不在于事后识别风险因素,而在于在恰当的时机——即患者出院前——及时发现这些风险因素。

为了评估再入院风险,我需要针对每位患者同时回答以下五个问题:

  • 该患者近期住院过几次?
  • 该患者是否患有多种活动性慢性病?
  • 该患者目前是否正在服用五种或更多种药物(多药联用)?
  • 病历中是否有任何异常实验室检查结果?
  • 是否有缺席随访的情况?

如果通过 Python 解析 FHIR 数据包来回答这五个问题,不仅速度慢,而且容易出错。而 FHIR SQL Builder 则让这一切变得简单明了。


设置投影

FHIR SQL Builder 可为存储在 IRIS 中的 FHIR 资源生成可通过 SQL 访问的投影。配置完成后,诸如 Encounter、Condition、MedicationRequest 和 Observation 等资源将转变为具有清晰列名的可查询表。

就我而言,这些投影位于 HSFHIR_X0001_S 模式下——这是 IRIS 通过 InstallInstance 自动为首个安装的 FHIR 端点分配的名称。除了 FHIR 服务器本身提供的功能外,无需进行任何额外设置。


实际查询示例

检测近期入院患者

SELECT subject AS patient_id, COUNT(*) AS admission_count
FROM HSFHIR_X0001_S.Encounter
WHERE status = 'finished'
  AND class LIKE '%IMP%'
GROUP BY subject
HAVING COUNT(*) > 1

此查询用于识别拥有两次及以上完整住院记录的患者。class LIKE '%IMP%' 过滤器用于匹配住院记录——IRIS for Health 将类别编码存储为包含代码的复合字符串,因此使用 LIKE 运算符而非等号运算符。每个结果都会直接计入再入院风险评分。

检测多药联用

SELECT subject AS patient_id, COUNT(*) AS medication_count
FROM HSFHIR_X0001_S.MedicationRequest
WHERE status = 'active'
GROUP BY subject
HAVING COUNT(*) >= 5

正在服用五种或更多有效药物的患者会被自动标记。这是已确立的再入院风险因素,若不使用 SQL Builder,则需要遍历嵌套的 JSON 数组才能实现。

涉及三张表连接的高风险人群

SELECT
    p.Key AS patient_id,
    DATEDIFF('yy', p.BirthDate, CURRENT_DATE) AS age,
    p.gender,
    COUNT(DISTINCT e.Key) AS total_encounters,
    COUNT(DISTINCT c.Key) AS active_conditions
FROM HSFHIR_X0001_S.Patient p
LEFT JOIN HSFHIR_X0001_S.Encounter e
    ON e.Subject = p.Key
LEFT JOIN HSFHIR_X0001_S.Condition c
    ON c.Subject = p.Key
GROUP BY p.Key, p.BirthDate, p.gender
HAVING COUNT(DISTINCT e.Key) >= 2
    OR COUNT(DISTINCT c.Key) >= 2
ORDER BY total_encounters DESC, active_conditions DESC

该查询通过单个语句将“患者”、“病症”和“就诊记录”表进行连接,以识别曾多次住院或患有多种活跃病症的患者——这两者是再入院风险最强的结构性预测因子。 HAVING子句完全在服务器端进行筛选,若不使用 SQL Builder,则需要进行 N+1 次 REST API 调用。


将 SQL 结果连接到 AI 代理

评分引擎会运行这五个查询,按患者汇总结果,并生成 0 到 100 之间的风险评分。该评分作为结构化上下文直接输入到 GPT-4o 临床代理中。

risk_context = f"""
Patient risk profile from FHIR SQL analysis:
- Recent admissions: {admission_count}
- Active medications: {medication_count}
- Active conditions: {condition_count}
- Abnormal observations: {abnormal_obs_count}
- Risk score: {risk_score}%

Identify additional clinical risks and generate a personalized discharge plan.
"""

该代理不直接处理原始的FHIR JSON数据,而是基于结构化的SQL输出进行处理。这使得推理过程更快、消耗的令牌更少,并且更能聚焦于临床上真正重要的内容。


临床医生所见内容

仪表盘显示按再入院风险排序的患者列表,并详细列出了影响各评分结果的具体因素。点击某位患者可打开由AI生成的出院计划,系统会将其作为FHIR CarePlan资源(附带相关Task资源)写回IRIS系统。

医生在出院时会看到一份按优先级排序的工作清单。风险最高的患者将优先进行审查。出院计划已起草完毕,静待处理。


为何这种方法行之有效

FHIR SQL Builder 消除了 FHIR 分析中的最大阻力:互操作性数据存储与分析查询之间的鸿沟。IRIS for Health 无需在 FHIR 合规性和 SQL 的表达能力之间做出取舍,而是让您同时兼得两者。

对于任何基于 FHIR 数据构建临床决策支持系统的人来说,正是这一功能使得在单一平台内进行人群级分析成为可能。


链接

如果您觉得这篇文章有帮助,请在比赛页面上投上一票,您的支持对我们意义重大。感谢您的阅读。

#IRISforHealth #FHIR #FHIRSQLBuilder #AIAgents #竞赛 #临床AI #Python