如何根据入院和出院日期计算入住人数

Posted

技术标签:

【中文标题】如何根据入院和出院日期计算入住人数【英文标题】:how to calculate occupancy on the basis of admission and discharge dates 【发布时间】:2021-10-05 21:22:10 【问题描述】:

假设我有如下示例所示的患者入院/索赔数据。 patient_id 和 hosp_id 列的数据类型为VARCHAR

表名claims

rec_no patient_id hosp_id admn_date discharge_date
1 1 1 01-01-2020 10-01-2020
2 2 1 31-12-2019 11-01-2020
3 1 1 11-01-2020 15-01-2020
4 3 1 04-01-2020 10-01-2020
5 1 2 16-01-2020 17-01-2020
6 4 2 01-01-2020 10-01-2020
7 5 2 02-01-2020 11-01-2020
8 6 2 03-01-2020 12-01-2020
9 7 2 04-01-2020 13-01-2020
10 2 1 31-12-2019 10-01-2020

我有另一个表,其中存储了医院的床位强度/最大入住强度。

表名beds

hosp_id bed_strength
1 3
2 4

预期结果我想找出医院宣布的床位强度在任何一天都超过的日期。

我尝试过的代码 什么都没有,因为我是 SQL 新手。但是,我可以通过以下策略在 R 中解决这个问题

pivot_longer 日期 tidyr::complete() 两者之间缺少日期 summariseaggregate 每个日期的结果。

同时,我还想知道是否可以在 sql 中不进行旋转(如果有)的情况下完成,因为在 claims 表中有 1500 万 + 行,旋转真的真的减慢了这个过程。请帮忙。

【问题讨论】:

您需要计算重叠间隔。存在各种解决方案。 你能给我提供其中任何一个的链接吗? 尝试this answer中的方法。基本上,您使用 union all 创建一组进入和退出日期,然后执行运行总和......在进入时增加它并在退出时减少它。总和大于 x 的日期是您的目标。 @AnilGoyal 你也可以添加预期的结果吗? 【参考方案1】:

您可以使用generate_series() 在 Postgres 中执行非常类似的操作。入住日期:

select c.hosp_id, gs.date, count(*) as occupanyc
from claims c cross join lateral
     generate_series(admn_date, discharge_date, interval '1 day') gs(date)
group by c.hosp_id, gs.date;

然后使用它作为子查询来获取超过阈值的日期:

select hd.*, b.strength
from (select c.hosp_id, gs.date, count(*) as occupancy
      from claims c cross join lateral
           generate_series(c.admn_date, c.discharge_date, interval '1 day') gs(date)
      group by c.hosp_id, gs.date
     ) hd join
     beds b
     using (hosp_id)
where h.occupancy > b.strength

【讨论】:

感谢戈登的帮助。有用。我还不知道这个generate series。我认为它的工作原理类似于 tidyr::complete() in r 你能解释一下lateral在这里做什么吗?我正在尝试理解语法 @AnilGoyal 。 . .在这种情况下,实际上什么都没有,因为 Postgres 允许 generate_series() 引用先前定义的表中的列。但是,这确实是横向连接的一个示例,所以我想明确一点。

以上是关于如何根据入院和出院日期计算入住人数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中使行条目水平配对

计算酒店的人数 (R)

excel中,知道入职日期和离职日期,怎么求一月在职人数?急求……

创建由多列和连续日期分区的序列

access计算日期之差

如何推断 SQL Server 中的日期以计算每日计数?