首页 > 解决方案 > 根据时间范围聚合多行

问题描述

我确实有一个customer,他在特定的时间段内使用不同的设备,并用 avalid_fromvalid_to日期进行跟踪。但是,每次此设备发生某些变化时,都会写入一个新行,而不会对基于行的数据进行任何可见的更改,除了新的有效 from/to 之外。

数据看起来像这样

我想要做的是aggregate将前两行合二为一,对于 row34,同时离开56原样。到目前为止,我提出的所有解决方案都在为不切换回device a. 一切都在失败。

我真的很感激一些帮助,在此先感谢!

标签: sqloracle

解决方案


如果您知道 previousvalid_to与 current 相同valid_from,则可以使用lag()来标识新分组的开始位置。然后使用累积和计算分组,最后聚合:

select cust, act_dev, min(valid_from), max(valid_to)
from (select t.*,
             sum(case when prev_valid_to = valid_from then 0 else 1 end) over (partition by cust order by valid_from) as grouping
      from (select t.*,
                   lag(valid_to) over (partition by cust, act_dev order by valid_from) as prev_valid_to
            from t
           ) t
     ) t
group by cust, act_dev, grouping;

是一个 db<>fiddle。


推荐阅读