使用延迟访问 mysql 中的上一行值
Using lag to access previous row value in mysql
我有一个日期时间列,即 fromDate
和 toDate
。
我想弄清楚间隔是否连续。
我的 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
我有一个日期时间列,即 fromDate
和 toDate
。
我想弄清楚间隔是否连续。
我的 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