根据时间范围汇总多行

时间:2019-07-26 08:51:15

标签: sql oracle

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

data looks like that

我要做的是将前两行aggregate {1}合并为一,34相同,而5和{{1 }} 像他们那样。到目前为止,我提出的所有解决方案都适用于用户的使用历史记录,而不是切换回6。一切都在失败。

我非常感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

如果您知道先前的valid_to与当前的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;

Here是db <>小提琴。