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

在SQL中折叠日期范围(Netezza),sql,netezza,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

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

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
我的目标是获得每个单元的入院/出院日期。问题是,有时患者在同一单元内更换床位,即使患者仍在同一单元内,此操作仍被标记为转移。因此,我希望折叠这些日期范围,使输出看起来像这样:

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
我不知道如何实现这一点……我在考虑应该使用哪个分区,但我能想到的每个排名分区(秩/密秩)都会将前两个ER值指定为与最后一个ER值相同的秩,这是不正确的

基本上,我的问题是相同的这是一个未回答的问题:


我正在使用Netezza。

您可以使用
左连接来查看是否有内容连接到上一条记录。如果没有连接,那么你有一个“连续周期”的开始。然后,累积和分配一个分组,该分组可用于聚合

这就是此查询的工作方式:

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

两个问题:1)分区中的字段是否来自t或tprev?2) 我不太确定总和在做什么,我可以看到输出,但我承认我混淆了字段来自
t
tprev
仅用于获取标志的信息。
sum()。对于要调用的组,该值应为常量。