使用延迟访问 mysql 中的上一行值

Using lag to access previous row value in mysql

我有一个日期时间列,即 fromDatetoDate

我想弄清楚间隔是否连续。

我的 table 是这样的:

我想以 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

知道怎么做吗?

这是一个 gaps-and-islands 问题,您希望将“相邻”行组合在一起。

这是一个选项,使用 lag() 恢复上一行的 todate,然后使用 window 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,我们可以稍微简化一下window求和中的表达式。这个更短,应该可以正常工作:

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