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
相关产品推荐
相关产品推荐

