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

Collapsing date ranges in 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

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

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。

您可以使用 left join 查看是否有内容与之前的记录相关联。如果没有连接,那么你有一个"continuous period"的开头。然后,一个累计和分配一个分组,可以用来聚合。

这就是这个查询的工作原理:

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分钟内发生的,你可以引入非相等逻辑。