使用滞后访问mysql中的前一行值

Posted

技术标签:

【中文标题】使用滞后访问mysql中的前一行值【英文标题】:Using lag to access previous row value in mysql 【发布时间】:2020-10-25 22:25:13 【问题描述】:

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

我试图弄清楚间隔是否连续。

这就是我的桌子的样子:

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

知道怎么做吗?

【问题讨论】:

【参考方案1】:

这是一个间隙和孤岛问题,您希望将“相邻”行组合在一起。

这是一个选项,使用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,我们可以稍微简化一下 window sum 中的表达式。这更短,应该可以正常工作:

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

【讨论】:

以上是关于使用滞后访问mysql中的前一行值的主要内容,如果未能解决你的问题,请参考以下文章

当在应用中也计算前一个值时,Pandas 中是不是可以使用 dataframe.apply 中的前一行值?

滞后函数 - 为最后一个值创建虚拟行?

MySQL lag() 具有默认值的前一行值

比较 Pandas DataFrame 中的前一行值

需要帮助使用局部变量减去具有多个组的前一行值

如何在不使用自连接的情况下汇总 MySQL 中每一行的前 30 天?