【问题标题】:How to calculate time between values in a table?如何计算表中值之间的时间?
【发布时间】:2021-09-28 14:29:02
【问题描述】:
感谢您有时间阅读我的问题。
我有一个 mysql 表,它连续记录一个传感器的 ON 和 OFF 操作。添加新行且值为 ON 时,是否可以计算 OFF 和 ON 之间的时间?
这是我的桌子
| Time |
Action |
Sensor |
Duration |
| 14:06 |
OFF |
001 |
|
| 14:06 |
OFF |
002 |
|
| 15:32 |
OFF |
003 |
|
| 16:41 |
ON |
002 |
duration between OFF (14:06) and ON (16:41) |
| 17:58 |
ON |
001 |
duration between OFF (14:06) and ON (17:58) |
| 18:02 |
OFF |
001 |
|
| 18:14 |
ON |
001 |
duration between OFF (18:02) and ON (18:14) |
这可能吗?
感谢您的宝贵时间。
【问题讨论】:
标签:
mysql
row
calculated-columns
unique-values
【解决方案1】:
如果您使用的是 MySQL 8.0,则可以使用 LAG() window function:
mysql> select *, timediff(time, prev) as diff
from (
select *, lag(time) over (partition by sensor order by time) as prev
from mytable
) as t;
+----+----------+--------+--------+----------+----------+
| id | time | action | sensor | prev | diff |
+----+----------+--------+--------+----------+----------+
| 1 | 14:06:00 | OFF | 1 | NULL | NULL |
| 5 | 17:58:00 | ON | 1 | 14:06:00 | 03:52:00 |
| 6 | 18:02:00 | OFF | 1 | 17:58:00 | 00:04:00 |
| 7 | 18:14:00 | ON | 1 | 18:02:00 | 00:12:00 |
| 2 | 14:06:00 | OFF | 2 | NULL | NULL |
| 4 | 16:41:00 | ON | 2 | 14:06:00 | 02:35:00 |
| 3 | 15:32:00 | OFF | 3 | NULL | NULL |
+----+----------+--------+--------+----------+----------+
【解决方案2】:
假设每个传感器没有双关或开,因此每个传感器的状态为关-开-关-开。
您可以使用LEAD() 或LAG() windows 函数来访问分区sensor id 上发生的下一个/上一个时间。
SELECT sensor_stat.*,
-- access the "next" value of record (since we're order by time in descending order, so it's the previous time that there's an action occur for this sensor)
LEAD(time) OVER (PARTITION BY sensor ORDER BY time DESC) as last_action_occur_on
FROM sensor_stat
ORDER BY sensor_stat.time DESC;
给你
| time |
action |
sensor |
last_action_occur_on |
| 18:14:00 |
ON |
001 |
18:02:00 |
| 18:02:00 |
OFF |
001 |
17:58:00 |
| 17:58:00 |
ON |
001 |
14:06:00 |
| 16:41:00 |
ON |
002 |
14:06:00 |
| 15:32:00 |
OFF |
003 |
|
| 14:06:00 |
OFF |
001 |
|
| 14:06:00 |
OFF |
002 |
|
现在您只需要关注带有动作ON 的行,last_action_occur_on 将是此传感器上发生OFF 动作的时间,只需使用TIMEDIFF(last_action_occur_on, time) 即可获得最后一个@ 之间的持续时间987654332@ 时间戳和这个ON 时间戳。
了解更多:
MySQL Lead function
MySQL TIMEDIFF function