使用第一行和最后一行压缩多个连续行



我正试图找到一种方法,将连续的类似记录压缩成一行,例如:

Status    starttime                 endtime
State1    2020-11-01 13:00:29.000   2020-11-01 13:03:59.000
State1    2020-11-01 13:03:59.000   2020-11-01 13:04:01.000
State1    2020-11-01 13:04:01.000   2020-11-01 13:05:27.000
State1    2020-11-01 13:05:27.000   2020-11-01 13:05:29.000
State2    2020-11-01 13:05:29.000   2020-11-01 13:11:31.000
State2    2020-11-01 16:19:35.000   2020-11-01 16:19:55.000

会凝结成

Status      starttime                 endtime
State1      2020-11-01 13:00:29.000   2020-11-01 13:05:29.000
State2      2020-11-01 13:05:29.000   2020-11-01 13:11:31.000
State2      2020-11-01 16:19:35.000   2020-11-01 16:19:55.000

在这种情况下,前4行已经被压缩,因为它们是相同的状态,并且是连续的时间。最后两行没有被压缩,因为它们之间的时间间隔。

这可能吗?

这是一个间隙和孤岛问题,需要将具有相同状态和相邻句点的连续行分组在一起。

您可以使用窗口功能;这个想法是用一个窗口和来定义组,每当状态发生变化或周期中断时,窗口和就会增加:

select min(status) as status, min(starttime) as starttime, max(endtime) as endtime
from (
select t.*,
sum(case when starttime = lag_endtime and status = lag_status then 0 else 1 end) over(order by starttime) as grp
from (
select t.*,
lag(endtime) over(order by starttime) lag_endtime,
lag(status)  over(order by starttime) lag_status
from mytable t
) t
) t
group by grp

DB Fiddle上的演示

status | starttime | endtime:-----|:------------------------|:----------------------状态1|2020-11-01 13:00:29.000|2020-111-1 13:05:29.000状态2|2020-11-01 13:05:29.000|2020-12-01 13:11:31.000状态2|2020-11-01 16:19:35.000|2020-12-01 16:19:55.000

最新更新