You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL拆分用药列为两列 按MRN查询患者Tylenol联合用药记录

核心问题定位

你写的SQL存在3个直接导致结果错误的问题:

  • 同一行的Medication_Description字段同时取别名Med1、Med2,本质是同一个值复制了两份,没有实现跨记录匹配第二种药物的逻辑
  • 窗口函数排序规则错误:按药名字符倒序排列,无法取到近1年的最新记录,需求明确要求取最近1年的前2条ICU记录,应该按开药日期Date倒序排序
  • 过滤逻辑错误:子查询中提前加了Medication_Description LIKE '%Tylenol%'条件,会把同患者其他非Tylenol的用药记录全部过滤掉,根本无法匹配到Ibuprofen等第二种药物,且外层重复写了日期过滤条件,属于冗余逻辑。
修正后代码

采用CTE分步计算,逻辑清晰且适配SSRS报表统计需求:

WITH ICU_Med_Last1Year AS (
    -- 第一步:先筛出近1年所有ICU用药记录,不提前过滤药名
    SELECT
        MRN,
        Medication_Description,
        Department_Name,
        Date,
        -- 按开药日期倒序给每个患者的记录打行号,最新的记录行号为1
        ROW_NUMBER() OVER (
            PARTITION BY MRN
            ORDER BY Date DESC
        ) AS Row_Num
    FROM T_Med_Orders
    WHERE
        Date BETWEEN DATEADD(YEAR, -1, GETDATE()) AND GETDATE()
        AND Department_Name = 'ICU'
),
Patient_Top2_Records AS (
    -- 第二步:每个患者只保留最新的2条记录
    SELECT *
    FROM ICU_Med_Last1Year
    WHERE Row_Num <= 2
)
-- 第三步:行转列得到Med1、Med2字段,同时筛选首药用Tylenol的患者
SELECT
    MRN,
    MAX(CASE WHEN Row_Num = 1 THEN Medication_Description END) AS Med1,
    MAX(CASE WHEN Row_Num = 2 THEN Medication_Description END) AS Med2,
    Department_Name,
    MAX(Date) AS Latest_Medication_Date
FROM Patient_Top2_Records
GROUP BY MRN, Department_Name
-- 仅保留最新一次用药为Tylenol的符合入组要求的患者
HAVING MAX(CASE WHEN Row_Num = 1 THEN Medication_Description END) LIKE '%Tylenol%'
ORDER BY MRN
规则适配说明
  • 无第二条用药记录的患者(如你提到的MRN=654321),Med2字段自动返回NULL,后续SSRS统计时仅需要判断Med2 LIKE '%Ibuprofen%'即可完成同时用药占比计算
  • 仅1条用药记录的患者(如你提到的MRN=246824),Med2字段同样自动返回NULL,符合规则要求
  • 如果需要保留两行明细而非按患者聚合的单条结果,可以将第三步的聚合逻辑替换为自关联:用行号=1的记录左连接同MRN行号=2的记录即可,当前聚合版本直接输出患者维度的结果,更适配你后续计算占比的需求,不需要再做二次转换。

内容的提问来源于stack exchange,提问作者Cameron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:03:39