如何查询出院后30天内再入院的首入末次出院日期?
解决首次出院后30天内再入院的集群分组问题
你的需求核心是把同一患者在首次出院后30天内连续发生的入院/出院事件归为一个集群,然后提取每个集群的最早入院日期和最晚出院日期。当前的SQL只关联了单次出院和下一次入院,没法覆盖连续多次在30天窗口内的入院事件,所以需要用窗口函数来实现集群分组。
解决思路
我们可以通过以下步骤实现:
- 对每个患者的入院记录按入院日期排序,确保时间顺序正确。
- 判断当前入院是否属于上一个出院事件的30天窗口内,以此划分集群。
- 为每个集群分配唯一ID,最后按集群分组提取所需日期。
完整SQL实现(以SQL Server为例)
WITH RankedAdmissions AS ( -- 第一步:按患者ID和入院日期排序,获取前一次出院日期 SELECT PatientId, [Admit Date], [Discharge Date], -- 获取同一患者前一条记录的出院日期 LAG([Discharge Date]) OVER (PARTITION BY PatientId ORDER BY [Admit Date]) AS Prev_Discharge_Date, -- 判断当前入院是否在前一次出院的30天内,标记是否开启新集群 CASE WHEN DATEDIFF(dd, LAG([Discharge Date]) OVER (PARTITION BY PatientId ORDER BY [Admit Date]), [Admit Date]) <= 30 THEN 0 ELSE 1 END AS Is_New_Cluster FROM Table1 ), ClusterGroups AS ( -- 第二步:累加标记值生成唯一集群ID SELECT PatientId, [Admit Date], [Discharge Date], SUM(Is_New_Cluster) OVER (PARTITION BY PatientId ORDER BY [Admit Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cluster_Id FROM RankedAdmissions ) -- 第三步:按患者和集群分组,提取目标日期 SELECT PatientId, MIN([Admit Date]) AS First_Admit_Date, MAX([Discharge Date]) AS Last_Discharge_Date FROM ClusterGroups GROUP BY PatientId, Cluster_Id ORDER BY PatientId, First_Admit_Date;
关键步骤解释
RankedAdmissions CTE:
- 用
LAG函数获取同一患者的上一次出院日期,实现当前入院与前次出院的时间对比。 Is_New_Cluster字段标记当前记录是否属于新集群:若当前入院与前次出院间隔超过30天则标记为1,否则为0。
- 用
ClusterGroups CTE:
- 用
SUM窗口函数累加Is_New_Cluster值,同一集群内的记录会获得相同的Cluster_Id,新集群会自动累加生成新ID,完成集群的唯一标识。
- 用
最终查询:
- 按患者ID和集群ID分组,直接提取每个集群的最早入院日期和最晚出院日期,完全匹配你的需求。
针对样本数据的输出结果
对于你提供的A001样本数据,执行上述SQL后会得到以下结果:
| PatientId | First_Admit_Date | Last_Discharge_Date |
|---|---|---|
| A001 | 12/20/2019 | 1/17/2020 |
| A001 | 4/18/2020 | 5/27/2020 |
| A001 | 8/22/2020 | 11/19/2020 |
可以看到:
- 4/18/2020到5/27/2020之间的所有入院/出院都被归为一个集群(间隔均在30天内)。
- 8/22/2020到11/19/2020的连续入院也被正确归为一个集群。
内容的提问来源于stack exchange,提问作者Jaggi
相关产品推荐
相关产品推荐

