我的数据集看起来像这样:
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。
答案 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分钟内,您可以引入非相等逻辑。