使用SQL查询检测db列中行之间的“步骤更改”?

时间:2013-04-02 20:46:18

标签: mysql sql

我在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

1 个答案:

答案 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列上有索引,则表现良好。