使用lag访问mysql中的前一行值

问题描述

我有一个日期时间列,分别是fromDatetoDate

我正在尝试确定间隔是否连续。

这是我的桌子的样子:

enter image description here

我希望以3个间隔获得以下结果:

fromDate            | toDate
2020-05-23 08:00:00 | 2020-05-23 09:15:00
2020-05-23 11:00:00 | 2020-05-23 12:00:00
2020-05-23 15:00:00 | 2020-05-23 15:30:00

有什么想法吗?

解决方法

这是一个空白问题,您希望将“相邻”行分组在一起。

这里是一个使用lag()来恢复上一行上的todate,然后是窗口sum()来标识孤岛的选项。最后一步是汇总每个岛屿:

select min(fromdate) fromdate,max(todate) todate
from (
    select t.*,sum(case when fromdate = lag_todate then 0 else 1 end) over(order by fromdate) grp
    from (
        select t.*,lag(todate) over(order by fromdate) lag_todate
        from mytable t
    ) t
) t
group by grp

注意:由于您正在运行MySQL,我们可以稍微简化窗口和中的表达式。这更短了,应该可以正常工作:

sum(1 - fromdate <=> lag_todate) over(order by fromdate) grp