mysql - 从表中计算每隔一行的时间差

标签 mysql sql

Note: The data for my question is on SQLFiddle right here where you can query it.

表是如何创建的

我有一个表中的数据并使用以下逻辑放入临时表中,但是 BETWEEN 开始和结束日期时间戳是根据存储过程中的其他逻辑等动态生成的。

SET @RowNum = 0;
DROP TEMPORARY TABLE IF EXISTS temp; 
CREATE TEMPORARY TABLE temp AS

SELECT @RowNum := @RowNum + 1 RowNum
        , TimeStr
        , Value        
FROM mytable     
WHERE TimeStr BETWEEN '2018-01-31 06:15:56' AND '2018-01-31 19:27:09'
AND iQuality = 3 ORDER BY TimeStr; 

这给了我一个临时表,其中的行号从最旧的 TimeStr 记录开始递增一个数字,所以最旧的是第一条记录的时间或 RowNum 1.

Temp Table

enter image description here


数据

您可以获取此临时表数据并在 SQLFiddle 上使用查询我已经创建了,但我在那里尝试了一些东西,你会在那里看到它们并没有给我我需要的东西。

尝试进一步澄清

我需要根据每个集合中的 TimeStr 值获取每个 ONOFF 集合的时间,我可以使用TIMEDIFF()功能。

我很难弄清楚如何让它给我每个ONOFF 记录的结果。记录始终按从旧到新的顺序排列,行号也始终从 1 开始。

我知道如何需要给每两条记录一个接一个 RowNum 值明智的匹配 CycleNum 从 1 开始并且每个 增加一个ONOFF 循环或设置。

我可以使用 TIMEDIFF(MAX(TimeStr), MIN(TimeStr)) 作为持续时间 但我不确定如何最好地让它每两个 RowNum 分组按照解释的顺序记录,以便为每个集合提供一个递增的后续 CycleNum 值。


预期输出

对于所有 ONOFF 周期或按组和顺序的每两个 RowNum,预期的输出显示如下图所示。

enter image description here

输出说明

我需要输出包括每个ONOFF 循环的开始时间、结束时间以及开始和停止之间的持续时间。

enter image description here

最佳答案

如果你能保证两件事:

  • 行号严格按顺序排列,没有间隙。
  • 开/关标志始终交替。

然后您可以使用相对简单的 join 来完成此操作。代码如下:

SELECT (@rn := @rn + 1) as cycle, t.*, tnext.timestr,
       timediff(tnext.timestr, t.timestr)
FROM temp t JOIN
     temp tnext
     ON t.rownum = tnext.rownum - 1 and
        t.value = 1 and
        tnext.value = 0 cross join
     (SELECT @rn := 0) params;

如果这些条件不成立,则需要更复杂的逻辑。

关于mysql - 从表中计算每隔一行的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573048/

相关文章:

php - 数据插入错误列计数与 Mysql 数据库中第 1 行的值计数不匹配?

php - SQLSTATE[23000] : Integrity constraint violation

mysql - 如何查看表结构sql查询?

sql - EXEC Select 语句与动态列将值存储到变量中

SQL Server 2008 - 名称 "Procedures"是否保留?

MySQL数据库大小

Mysql:连接翻译记录表

mysql - Node.js 中的单元测试和模拟 mySQL 数据库

php - 查找相似商品并按常见标签数量排序

mysql - SELECT * 在联接内