按值计算状态中的时间

iyfjxgzm  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(263)

我有一个mysql表,其中包含时间序列数据,我想通过值来获取状态中的总时间。
这张table看起来像:

+----------------+---------------------+---------------+------------+
|             id | status_update_time  | current_state | last state |
+----------------+---------------------+---------------+------------+
|            248 | 2017-02-17 05:00:00 |             1 |          0 |
|            248 | 2017-02-17 02:00:00 |             0 |          1 |
|            248 | 2017-02-17 01:00:00 |             1 |          0 |
|            250 | 2017-02-17 06:00:00 |             0 |          1 |
|            250 | 2017-02-17 05:00:00 |             1 |          0 |
|            252 | 2017-02-17 06:00:00 |             0 |          2 |
|            252 | 2017-02-17 03:00:00 |             2 |          0 |
|            254 | 2017-02-17 03:00:00 |             0 |          1 |
|            254 | 2017-02-17 02:00:00 |             1 |          0 |
|            254 | 2017-02-17 01:00:00 |             0 |          1 |
|            254 | 2017-02-17 00:00:00 |             1 |          2 |
+----------------+---------------------+---------------+------------+

我想要的预期结果是:

+----------------+---------------------+----------------+
|             id | state               | time_in_seconds|          
+----------------+---------------------+----------------+
|            248 | 0                   |          10800 |
|            248 | 1                   |           3600 |
|            250 | 1                   |           3600 |
|            252 | 2                   |          10800 |
|            254 | 0                   |           7200 |
|            254 | 1                   |           7200 |
+----------------+---------------------+----------------+

编辑:我还不能生成第二个表,但我想。
生成第二个表的逻辑将是id 248,状态1为3600秒,状态0为10800秒。这是因为从2017-02-17 01:00:00到2017-02-17 02:00:00处于1状态,然后从2017-02-17 02:00:00到2017-02-17 05:00:00处于0状态,然后更改为1状态。

m528fe3b

m528fe3b1#

SELECT id, cur_state, SUM(duration) as total_time
FROM (
  SELECT id, cur_state,
  (SELECT TIME_TO_SEC(TIMEDIFF(MIN(InnerTable.status_update_time), OuterTable.status_update_time)) FROM t as InnerTable
  WHERE
   InnerTable.last_state = OuterTable.cur_state
   AND
   InnerTable.status_update_time > OuterTable.status_update_time
   AND
   InnerTable.id = OuterTable.id
  ) duration
  FROM t as OuterTable
) anyName
WHERE duration IS NOT NULL
GROUP BY id, cur_state

您可以在这里查看:http://sqlfiddle.com/#!9月6日8439/38

相关问题