我在MySQL表中有一个列,行的值之间的间隔几乎相等(类型是datetime)。在某些时候,这个间隔变得小得多,并且在表格结束之前一直很小。我需要得到一个与区间突然跳跃相对应的单元格的值。
当然我可以下载整个内容,扫描值并检测步进更改,但此应用程序是基于Web的,我希望避免不必要的负载。我可以通过纯粹的MySQL手段来检测踩踏突然发生的变化吗?
示例:
# step is 1 month for some rows...
1960.01.01 00:00:00
1960.02.01 00:00:00
1960.03.01 00:00:00 <- at this point, step changes to just 1 hour
1960.03.01 01:00:00
1960.03.01 02:00:00
1960.03.01 03:00:00
我需要一个查询返回“1960.03.01 00:00:00”的值,这是踩踏突然改变的点。
提前致谢,Askar
答案 0 :(得分:0)
您可以尝试以下操作:
select *
from (select t.*,
(select MIN(t.dt) from t t2 where t2.dt > t.dt
) as nexttime,
(select MAX(t.dt) from t t2 where t2.dt < t.dt
) as prevtime
from t
) t
where to_seconds(t.dt) - to_seconds(t.prevtime) <> to_seconds(t.nexttime) - to_seconds(t.dt)
子查询使用相关子查询计算之前的最大时间(prevtime
)和第一次(nexttime
之后)。然后检查上一次和下一次之间每行的时间差。当差异(以秒为单位)不同时,选择行。
如果您在datetime
列上有索引,则表现良好。