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

Posted

技术标签:

【中文标题】使用第一行和最后一行压缩多个连续行【英文标题】:Condense multiple consecutive rows using first and last row 【发布时间】:2021-03-13 19:49:43 【问题描述】:

我正在尝试找到一种方法将连续的相似记录压缩为 1 行,例如:

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 行已经被压缩,因为它们是相同的状态,并且是连续的时间。最后2行没有压缩,因为它们之间有时间间隔。

这可能吗?

【问题讨论】:

你试过什么?你在哪里卡住了?向我们展示你的尝试。 差距有多普遍?记录可以是:A--B---B--C--A--C吗? 【参考方案1】:

这是一个间隙和孤岛问题,您希望将具有相同状态和相邻周期的连续行组合在一起。

你可以使用窗口函数;这个想法是定义组的窗口总和,只要有状态变化或周期中断,窗口总和就会增加:

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

Demo on DB Fiddle

状态 |开始时间 |时间结束 :----- | :------------------------ | :------------------------ 状态1 | 2020-11-01 13:00:29.000 | 2020-11-01 13:05:29.000 状态2 | 2020-11-01 13:05:29.000 | 2020-11-01 13:11:31.000 状态2 | 2020-11-01 16:19:35.000 | 2020-11-01 16:19:55.000

【讨论】:

非常感谢 GMB,我所拥有的只是一个模糊的概念和一堆在我尝试之前就知道行不通的想法。这是完美的。

以上是关于使用第一行和最后一行压缩多个连续行的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中用VBA操作WORD表格:怎样选择一个表格中除第一行以外的任意连续行(比如第2到4行)?

当两个或多个连续行具有相同状态时如何选择一行

shell 读取文件指定单行 多行 连续行 倒数几行

获取第n个连续组的第一行/最后一行

linux文本处理工具

在两个单独的列中折叠具有连续范围的行