sql - 如何从住院患者表中对再入院病例进行子集化,以计算 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。有人可以帮我这样做吗?提前致谢
解决方案
该Readmitted30days
专栏似乎与问题无关,完全是红鲱鱼。您似乎想要的是聚合彼此相隔 30 天内的行。
这是一种差距和孤岛问题。有很多解决方案,这里是一个:
- 我们
LAG
用来检查前一个DischDate
是否在此之后的 30 天内AdmissionDate
- 基于此,我们通过运行计数来分配分组 ID
- 然后简单地 group by
ID
和我们的分组 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;
推荐阅读
- php - 如何在 Flutter 中反序列化 php 中的序列化数据?
- vba - 按钮与模块不同?
- php - TCPDF 强制内容在单页中显示或根据内容扩展页面高度
- javascript - 当元素获得焦点时停止输入文本
- node.js - 为什么 Redis 进入异步功能太慢了?
- macos - ld:找不到 -lSystem macOS Big Sur 11.1 的库
- bash - 将交互式命令绑定到键序列
- python - 移除对象后移除媒体文件
- c - 用空格和符号扫描一行以分隔条目并使用 C 中的结构
- c# - 为什么将 FormatConvertedBitmap 设置为备用图像源会引发“源”未设置异常?