sql - 如何从 SQL 中的历史住院数据计算每月 30 天的再入院率?
问题描述
我想根据 5 年 (60) 个月的住院数据计算每月再入院率。部分住院患者在这段时间内再次入院10次以上,而另一些则只有一次。
数据表如下所示。例如,身份证号为住院病人。201 五年内只被录取一次,但 ID 没有。212人4次,其中2人3天内再入院。
如何使用 SQL 中的此类数据计算医院每月 30 天的再入院率?30 天再入院是指住院患者在上次出院后 30 天内再次入院 谢谢!
ID | SN | Admdate | Disdate |
+------+-------+-------------+---------------+
|**212 | 1 | 2014-01-01 | 2014-01-12** |
|201 | 2 | 2014-01-01 | 2014-01-10 |
|**212 | 598 | 2014-01-28 | 2014-02-12** |
|**212 | 10000 | 2016-12-23 | 2016-12-29 ** |
| **212| 15112 | 2017-06-10 | 2017-06-21 ** |
|*401 | 20101 | 2018-01-01 | 2018-01-11 |*
|*401 | 21101 | 2018-02-01 | 2018-02-13 |*
|401 | 22101 | 2018-10-01 | 2018-10-11 |
解决方案
看起来,我有点晚了,但尽管如此 - 这是我的建议:
WITH mnths AS (
select cast(1 as int) m
UNION ALL select m+1 FROM mnths WHERE m<60
), admdis AS (
SELECT *, 12*(year(admdate)-2014)+month(admdate)a, 12*(year(disdate)-2014)+month(disdate) d
FROM tbl t
WHERE exists (SELECT 1 FROM tbl WHERE id=t.id AND disdate>DATEADD(day, -30, t.admdate) and sn<t.sn)
)
SELECT (m-1)/12+2014 yr, 1+(m-1)%12 mn,m, count(id) readm
FROM mnths LEFT JOIN admdis ON a=m
GROUP BY m
我建立了一个数字表mnths
来生成一个定期的月份网格,然后我计算再入院人数。CTEadmdis
仅列出那些在上次出院后不到 30 天入院的患者。
可以在此处找到演示:https ://rextester.com/TLM57882
编辑:
在查看 forpas 的解决方案时,我意识到我没有计算实际的再入院率。这是一个修改版本,正是这样做的:
WITH mnths AS (
select cast(1 as int) m
UNION ALL select m+1 FROM mnths WHERE m<60
), admdis AS (
SELECT *, 12*(year(admdate)-2014)+month(admdate)a, 12*(year(disdate)-2014)+month(disdate) d,
(SELECT 1 FROM tbl WHERE id=t.id AND disdate>DATEADD(day, -30, t.admdate) and sn<t.sn) readm
FROM tbl t
)
SELECT (m-1)/12+2014 yr, 1+(m-1)%12 mn, count(id) totl ,count(readm) readm,
case when count(id)>0 THEN (0.+count(readm))/ count(id) ELSE 0 END rate
FROM mnths LEFT JOIN admdis ON a=m
GROUP BY m
在计算费率时,我必须确保我没有“除以零”,因此,在没有发生录取的那几个月里,费率被假定为零(但实际上并未计算)。
演示:https ://rextester.com/NFCXQ24711
这是生成的结果:
yr mn totl readm rate
2014 1 3 1 0.333333333333
2014 2 0 0 0.000000000000
2014 3 0 0 0.000000000000
2014 4 0 0 0.000000000000
2014 5 0 0 0.000000000000
2014 6 0 0 0.000000000000
2014 7 0 0 0.000000000000
2014 8 0 0 0.000000000000
2014 9 0 0 0.000000000000
2014 10 0 0 0.000000000000
2014 11 0 0 0.000000000000
2014 12 0 0 0.000000000000
2015 1 0 0 0.000000000000
2015 2 0 0 0.000000000000
2015 3 0 0 0.000000000000
2015 4 0 0 0.000000000000
2015 5 0 0 0.000000000000
2015 6 0 0 0.000000000000
2015 7 0 0 0.000000000000
2015 8 0 0 0.000000000000
2015 9 0 0 0.000000000000
2015 10 0 0 0.000000000000
2015 11 0 0 0.000000000000
2015 12 0 0 0.000000000000
2016 1 0 0 0.000000000000
2016 2 0 0 0.000000000000
2016 3 0 0 0.000000000000
2016 4 0 0 0.000000000000
2016 5 0 0 0.000000000000
2016 6 0 0 0.000000000000
2016 7 0 0 0.000000000000
2016 8 0 0 0.000000000000
2016 9 0 0 0.000000000000
2016 10 0 0 0.000000000000
2016 11 0 0 0.000000000000
2016 12 1 0 0.000000000000
2017 1 0 0 0.000000000000
2017 2 0 0 0.000000000000
2017 3 0 0 0.000000000000
2017 4 0 0 0.000000000000
2017 5 0 0 0.000000000000
2017 6 1 0 0.000000000000
2017 7 0 0 0.000000000000
2017 8 0 0 0.000000000000
2017 9 0 0 0.000000000000
2017 10 0 0 0.000000000000
2017 11 0 0 0.000000000000
2017 12 0 0 0.000000000000
2018 1 1 0 0.000000000000
2018 2 1 1 1.000000000000
2018 3 0 0 0.000000000000
2018 4 0 0 0.000000000000
2018 5 0 0 0.000000000000
2018 6 0 0 0.000000000000
2018 7 0 0 0.000000000000
2018 8 0 0 0.000000000000
2018 9 0 0 0.000000000000
2018 10 1 0 0.000000000000
2018 11 0 0 0.000000000000
2018 12 0 0 0.000000000000
该列totl
包含该时期的总入院readm
人数、再入院人数和rate
比率readm/totl
(或在为 0 的情况下totl
为 0)。
推荐阅读
- r - ShinydashBoard 呈现的 tabItem 未正确显示
- javascript - AJAX发送请求get方法,显示HTML页面
- javascript - 如何防止抽屉菜单内的内容缩小?
- javascript - JS - 创建一个回调函数,该函数接受调用它的函数返回的对象
- github - 无法将参考推送到远程。尝试先运行“拉”以集成您的更改
- r - R - ggplot geom_smooth 限制 y 轴而不改变回归线
- node.js - 如何使用 nodejs 下载带有 Blob url 的视频
- angular - 无法将输入参数发送到 Angular 中的验证器指令
- android - 如何在android的build.gradle文件中定义flutter应用程序的基本URL?
- reactjs - 你能帮我转换这个 React 星级吗?