首页 > 解决方案 > 如何从住院患者表中对再入院病例进行子集化,以计算 SQL Server 17 中再入院病例的总住院时间?

问题描述

我正在使用如下所示的住院患者数据表:

ID      | AdmissionDate |DischDate     |LOS |Readmitted30days 
+------+-------+-------------+---------------+---------------+
|001    | 2014-01-01    | 2014-01-12    |11 |1
|101    | 2014-02-05    | 2014-02-12    |7  |1
|001    | 2014-02-18    | 2018-02-27    |9  |1
|001    | 2018-02-01    | 2018-02-13    |12 |0
|212    | 2014-01-28    | 2014-02-12    |15 |1
|212    | 2014-03-02    | 2014-03-15    |13 |0
|212    | 2016-12-23    | 2016-12-29    |4  |0
|1011   | 2017-06-10    | 2017-06-21    |11 |0
|401    | 2018-01-01    | 2018-01-11   |10  |0
|401    | 2018-10-01    | 2018-10-10   |9   |0

我想从上面创建另一个表,其中汇总了在 30 天内重新入院的人的总逗留时间 (LOS)。我要创建的表如下所示:

ID      |Total LOS   
+------+-----------
|001    |39
|212    |28 
|212    |4
|1011   |11 
|401    |10 
|401    |9

我正在使用 SQL Server 版本 17。有人可以帮我这样做吗?提前致谢

标签: sqlrsql-server

解决方案


Readmitted30days专栏似乎与问题无关,完全是红鲱鱼。您似乎想要的是聚合彼此相隔 30 天内的行。

这是一种差距和孤岛问题。有很多解决方案,这里是一个:

  • 我们LAG用来检查前一个DischDate是否在此之后的 30 天内AdmissionDate
  • 基于此,我们通过运行计数来分配分组 ID
  • 然后简单地 group byID和我们的分组 ID,然后求和
  • 日期和LOS似乎不匹配,所以我给了你两个
WITH StartPoints AS (
    SELECT *,
      IsStart = CASE WHEN
          DATEADD(day, -30, AdmissionDate) <
          LAG(DischDate) OVER (PARTITION BY ID ORDER BY DischDate)
          THEN 1 END
    FROM YourTable
),
Groupings AS (
    SELECT *,
      GroupId = COUNT(IsStart) OVER (PARTITION BY ID ORDER BY DischDate ROWS UNBOUNDED PRECEDING)
    FROM StartPoints
)
SELECT
  ID,
  TotalBasedOnDates = SUM(DATEDIFF(day, AdmissionDate, DischDate)),  -- do you need to add 1 within the sum?
  TotalBasedOnLOS = SUM(LOS)
FROM Groupings
GROUP BY ID, GroupID;

db<>小提琴


推荐阅读