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
数据
您可以获取此临时表数据并在 SQLFiddle 上使用查询我已经创建了,但我在那里尝试了一些东西,你会在那里看到它们并没有给我我需要的东西。
尝试进一步澄清
我需要根据每个集合中的 TimeStr
值获取每个 ON 和 OFF 集合的时间,我可以使用TIMEDIFF()功能。
我很难弄清楚如何让它给我每个ON 和OFF 记录的结果。记录始终按从旧到新的顺序排列,行号也始终从 1 开始。
我知道如何需要给每两条记录一个接一个 RowNum
值明智的匹配 CycleNum
从 1 开始并且每个 增加一个ON 和OFF 循环或设置。
我可以使用 TIMEDIFF(MAX(TimeStr), MIN(TimeStr)) 作为持续时间
但我不确定如何最好地让它每两个 RowNum
分组按照解释的顺序记录,以便为每个集合提供一个递增的后续 CycleNum
值。
预期输出
对于所有 ON 和 OFF 周期或按组和顺序的每两个 RowNum
,预期的输出显示如下图所示。
输出说明
我需要输出包括每个ON 和OFF 循环的开始时间、结束时间以及开始和停止之间的持续时间。
最佳答案
如果你能保证两件事:
- 行号严格按顺序排列,没有间隙。
- 开/关标志始终交替。
然后您可以使用相对简单的 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/