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分钟内发生的,你可以引入非相等逻辑。
我有一个看起来像这样的数据集:
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分钟内发生的,你可以引入非相等逻辑。