基于SSMS按月份捕获患者用药路径并按Tag分组统计
在SSMS中实现患者用药路径统计
需求说明
- 针对每个患者ID,按月份先后顺序捕获用药路径(连续使用相同药物时仅保留一次,直到药物变更)
- 患者ID与标签(Tag)为一对一关系
- 按年份分组,再按Tag汇总各用药路径对应的患者数量
- 用药路径可包含1种或多种药物
输入数据
| 年份(Year) | 月份(Month) | 患者ID(ID) | 药物(Drug) | 标签(Tag) |
|---|---|---|---|---|
| 2020/21 | 3 | 127 | E | O |
| 2020/21 | 5 | 127 | E | O |
| 2020/21 | 7 | 127 | E | O |
| 2020/21 | 10 | 127 | L | O |
| 2020/21 | 3 | 121 | A | S |
| 2020/21 | 5 | 121 | A | S |
| 2020/21 | 6 | 121 | A | S |
| 2020/21 | 9 | 111 | A | D |
| 2020/21 | 10 | 111 | A | D |
| 2020/21 | 12 | 111 | L | D |
| 2020/21 | 8 | 110 | E | O |
| 2020/21 | 9 | 110 | L | O |
| 2020/21 | 5 | 10 | A | O |
| 2021/22 | 3 | 127 | E | O |
| 2021/22 | 5 | 127 | E | O |
| 2021/22 | 7 | 127 | E | O |
| 2021/22 | 10 | 127 | L | O |
| 2021/22 | 3 | 121 | A | S |
| 2021/22 | 5 | 121 | A | S |
| 2021/22 | 6 | 121 | A | S |
| 2021/22 | 9 | 111 | A | D |
| 2021/22 | 10 | 111 | A | D |
| 2021/22 | 12 | 111 | L | D |
| 2021/22 | 8 | 110 | E | O |
| 2021/22 | 9 | 110 | E | O |
| 2021/22 | 5 | 19 | E | O |
| 2021/22 | 7 | 91 | E | S |
预期输出
| 年份(Year) | 用药顺序(Drug Order) | 数量(Count) | 标签(Tag) |
|---|---|---|---|
| 2020/21 | E-->L | 2 | O |
| 2020/21 | A | 1 | S |
| 2020/21 | A-->L | 1 | D |
| 2020/21 | A | 1 | O |
| 2021/22 | E-->L | 1 | O |
| 2021/22 | A | 1 | S |
| 2021/22 | A-->L | 1 | D |
| 2021/22 | E | 2 | O |
| 2021/22 | E | 1 | S |
T-SQL实现代码
WITH RankedDrugs AS ( -- 为每个患者、年份的用药记录按月份排序,标记前一次使用的药物 SELECT Year, ID, Tag, Drug, Month, LAG(Drug) OVER (PARTITION BY Year, ID ORDER BY Month) AS PrevDrug FROM YourTableName -- 替换为实际表名 ), DistinctDrugPaths AS ( -- 过滤连续相同药物,仅保留药物变更节点 SELECT Year, ID, Tag, Drug FROM RankedDrugs WHERE PrevDrug IS NULL OR PrevDrug != Drug ), PatientDrugPaths AS ( -- 拼接每个患者的用药路径字符串 SELECT Year, ID, Tag, STRING_AGG(Drug, '-->') WITHIN GROUP (ORDER BY Month) AS DrugOrder FROM DistinctDrugPaths GROUP BY Year, ID, Tag ) -- 按年份、Tag、用药路径汇总患者数量 SELECT Year, DrugOrder AS [用药顺序(Drug Order)], COUNT(ID) AS [数量(Count)], Tag AS [标签(Tag)] FROM PatientDrugPaths GROUP BY Year, Tag, DrugOrder ORDER BY Year, Tag, DrugOrder;
代码说明
- RankedDrugs:使用
LAG()函数获取同一患者同一年份中前一次使用的药物,用于识别连续用药情况。 - DistinctDrugPaths:过滤掉连续使用相同药物的重复记录,只保留药物切换的节点,确保用药路径仅展示药物变更顺序。
- PatientDrugPaths:通过
STRING_AGG()函数按月份顺序拼接每个患者的药物,生成完整用药路径。 - 最终按年份、Tag和用药路径分组统计,得到各分组对应的患者数量。
内容的提问来源于stack exchange,提问作者Tars
相关产品推荐
相关产品推荐

