确定SQL中的重新读取

时间:2016-09-22 01:50:43

标签: sql netezza

我正在尝试编写一些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,以防万一。

1 个答案:

答案 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)