我正在寻找一种方法来获取第一行和下一行之间的时间戳,并打开时间戳。这个表的目的是记录一盏灯亮了多长时间。
我现在的布局是。。。

| id | light_id | timestamp         | log_type_id |
___________________________________________________
|  1 |        1 | current_timestamp |           1 |
|  2 |        4 | current_timestamp |           1 |
|  3 |        1 | current_timestamp |           2 |
|  4 |        1 | current_timestamp |           1 |

所以这里的想法是,我可以计算出ID 1到3之间的时间,然后4和下一个具有相同光ID的时间。我不知道这是否是进行此类日志记录的最佳方法,如果人们有更好的解决方案,我可以发表意见:)。
log_type_id 1 = on
log_type_id 2 = off

最佳答案

是的,这是一个很好的方法,但是在MySQL中,您需要等待MySQL 8.0来使用lead()和lag()分析函数,尽管它仍然可以在不访问分析函数的情况下使用。
这里有两个用老派的方法做的例子,第一个比较传统:

select t1.id, t1.light_id, t1.timestamp, t1.log_type_id
     , l1.timestamp Prior_Timstamp
     , timestampdiff(second, l1.timestamp, t1.timestamp) minutes
  from YourData t1
  left join YourData l1
    on l1.id = (select max(id) from YourData m1
                 where m1.id < t1.id
                   and m1.light_id = t1.light_id);

第二个使用了LIMIT/OFFSET子句,它允许您通过增加OFFSET来进一步查看:
select t1.id, t1.light_id, t1.timestamp, t1.log_type_id
     , l1.timestamp Prior_Timestamp
     , timestampdiff(second, l1.timestamp, t1.timestamp) minutes
  from YourData t1
  left join YourData l1
    on l1.id = (select id from YourData m1
                 where m1.id < t1.id
                   and m1.light_id = t1.light_id
                 order by id desc limit 1 offset 0);

向前看(lead)只需将不等式从,将第一个查询中的聚合从max改为min,或将第二个查询中的order by从desc改为asc。
这里有一个SQL Fiddle演示代码(未根据@草莓的请求隐藏注释)。

关于mysql - SQL |计算两行之间的时差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47189900/

10-14 13:57