在SQL(Netezza)中折叠日期范围

时间:2016-09-16 19:28:16

标签: sql netezza

我的数据集看起来像这样:

Visit ID   Admission Date       Discharge Date       Unit
20         01/01/2015 12:45     01/01/2015 13:57     ER
20         01/03/2015 13:57     01/04/2015 11:57     ER
20         01/04/2015 11:57     01/04/2015 19:32     Trauma
20         01/04/2015 19:32     01/04/2015 21:22     ER

我的目标是获得每个单元的入院/出院日期。问题是,有时患者会在同一单元内更换床位,即使患者仍在同一单位内,此操作也会被标记为转移。所以我想折叠那些日期范围,所以输出看起来像这样:

Visit ID   Admission Date       Discharge Date       Unit
20         01/01/2015 12:45     01/01/2015 11:57     ER
20         01/04/2015 11:57     01/04/2015 19:32     Trauma
20         01/04/2015 19:32     01/04/2015 21:22     ER

我不知道如何实现这个...我在想我应该使用什么分区但是我能想到的每个排名分区(rank / dense_rank)都会分配前两个ER值与最后一个相同的等级ER值,这是不正确的。

基本上,我的问题是同样的问题:Collapsing date records only if the value doesn't change - Oracle SQL

我正在使用Netezza。

1 个答案:

答案 0 :(得分:1)

您可以使用left join查看某些内容是否与之前的记录相关联。如果没有连接,那么你就有了一个连续时期的开始"。然后,累积和指定一个分组,可用于聚合。

这就是查询的工作原理:

select visitid, unit,
       min(admissiondate) as admissiondate,
       max(dischargedate) as dischargedate
from (select t.*,
             sum(case when tprev.visitid is null then 1 else 0 end) over
                 (partition by t.visitid, t.unit order by t.admissiondate 
                 ) as grp
      from t left join
           t tprev
           on t.visitid = tprev.visitid and t.unit = tprev.unit and
              t.admissiondate = tprev.dischargedate
     ) t
group by grp, visitid, unit;

注意:这假定新的入学日期与之前的出院日期完全相同。当然,如果要检查录取是否发生在10秒或5分钟内,您可以引入非相等逻辑。