我正在尝试编写一些SQL来识别在出院后30天内重新入院的患者,并且有一个转折:任何已标记为再入院的住院都不能算作指数入院。例如,给出以下数据:
patient_id admit_date discharge_date
123 01/01/2012 01/05/2012
123 01/15/2012 01/21/2012
123 02/10/2012 02/15/2012
第一行不是重新接纳,因为它是第一行。第二行是重新入场(2015年1月15日 - 2015年5月1日<30),但第三行不会:第二行是重新入场,因此最近的入场指数是01/05/2012, (2/10/2012 - 01/05/2012&gt;相隔30天)。
我的第一个想法是自我加入,例如:
select a1.patient_id, a1.admit_date, a1.discharge_date, max(nvl2(a2.patient_id, 1, 0)) as readmit
from admits a1 left join admits a2
on a1.patient_id = a2.patient_id
and a2.admit_date between a1.discharge_date+1 and a1.discharge_date+30
group by 1,2,3;
但这并未考虑重新入学不能作为指数入学的规则。我使用Netezza,以防万一。
答案 0 :(得分:0)
我认为您需要在表格中添加更多行才能完成它:
patient_id admit_date discharge_date
123 01/01/2012 01/05/2012
123 01/15/2012 01/21/2012
123 02/10/2012 02/15/2012
123 01/01/2016 01/05/2016
123 01/15/2016 01/21/2016
234 01/02/2012 01/02/2012
我认为按照你的定义,第四和第五行将是一系列新事件?
在这种情况下,我建议您通过几个步骤解决问题:
1)将所有数据放入一个新表中,使用窗口函数添加几列: A)序列(每个患者的计数从1开始) B)days_since(第一行为null,否则自最近一次出院以来的天数 您的数据现在如下所示:
patient_id admit_date discharge_date Sequence days_since
123 01/01/2012 01/05/2012 1 Null
123 01/15/2012 01/21/2012 2 10
123 02/10/2012 02/15/2012 3 20
123 01/01/2016 01/05/2016 4 321
123 01/15/2016 01/21/2016 5 10
234 01/02/2012 01/02/2012 1 Null
2)自己将新表连接到自身(类似这样)
Select
This.*,
Case
when coalesce(this.days_since,9999)> 30 then 'admission'
When prev.days_since<30 then 'duplicate re-admission'
Else 're-admission
End as Admission_indicator
From New_table This
left outer join new_table Prev
On (This.patient_id=prev.patient_id and this.sequence-1=Prev.sequence)