如何根据入院和出院日期计算入住人数
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()
两者之间缺少日期
summarise
或 aggregate
每个日期的结果。
同时,我还想知道是否可以在 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()
引用先前定义的表中的列。但是,这确实是横向连接的一个示例,所以我想明确一点。以上是关于如何根据入院和出院日期计算入住人数的主要内容,如果未能解决你的问题,请参考以下文章