如何从SQL中的历史住院患者数据计算每月30天的再入院率?
我想根据5年60个月的住院数据计算每月再住院率。一些住院患者在这段时间内再次入院超过10次,而其他患者只有一次 数据表如下所示。例如,身份证号为201的住院患者五年内仅入院一次,但身份证号为212的住院患者有四次,其中两人在三天内再次入院 如何使用SQL中的此类数据计算医院每月30天的再入院率?30天再入院是指住院患者在上次出院后30天内再次入院 谢谢大家!如何从SQL中的历史住院患者数据计算每月30天的再入院率?,sql,sql-server,Sql,Sql Server,我想根据5年60个月的住院数据计算每月再住院率。一些住院患者在这段时间内再次入院超过10次,而其他患者只有一次 数据表如下所示。例如,身份证号为201的住院患者五年内仅入院一次,但身份证号为212的住院患者有四次,其中两人在三天内再次入院 如何使用SQL中的此类数据计算医院每月30天的再入院率?30天再入院是指住院患者在上次出院后30天内再次入院 谢谢大家! ID | SN | Admdate | Disdate | +------+-------+------
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 cte as (
select
t.admdate,
case when exists (
select 1 from tablename
where id = t.id and sn <> t.sn and datediff(day, disdate, t.admdate) <= 30
) then 1 else 0 end readmission
from tablename t
where datediff(month, t.admdate, getdate()) <= 60
)
select
year(admdate) year,
month(admdate) month,
100.0 * sum(readmission) / count(*) readmissionrate
from cte
group by year(admdate), month(admdate)
order by year(admdate), month(admdate)
如果表的该行是重新读取,则CTE返回值为1的列重新读取,否则返回值为0。
然后通过使用group by YEARDAMDATE、monthadmdate,您可以通过SUMREADDISION获得重新读取的总数,并除以总行数。
请看。看起来,我有点晚了,但尽管如此-以下是我的建议:
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
在计算比率时,我必须确保我没有被零除,因此,在那些没有入学的月份,比率被假定为零,但没有实际计算
演示:
下面是生成的结果:
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再入院人数和比率是readm/totl的比率,如果totl为0,则为0。您期望的输出是什么?我使用的是SQL Server版本17。
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