每当 MySQL 中的行之间的值发生变化时,如何找到两个带时间戳的行之间的差异

How to find the difference between two timestamped rows whenever value changes between rows in MySQL

我的数据集如下所示:

D 列中给出的输出推导如下:

  1. 针对索引 2 的输出:索引 3 中的时间戳 - 索引 2 中的时间戳

  2. 针对索引 6 的输出:索引 10 中的时间戳 - 索引 6 中的时间戳

  3. 针对索引 12 的输出:索引 15 中的时间戳 - 索引 12 中的时间戳

数据集MySQLV2012

create table #temp11 (Index# int, TimeStamp# Datetime, Alarm int)

insert into #temp11 values
(1, '10/6/2019 00:08:01', 0),
(2, '10/6/2019 00:08:13'    ,1),
(3, '10/6/2019 00:08:15'    ,1),
(4, '10/6/2019 00:10:47'    ,0),
(5, '10/6/2019 00:10:58'    ,0),
(6, '10/6/2019 00:10:59'    ,1),
(7, '10/6/2019 00:11:00'    ,1),
(8, '10/6/2019 00:11:01'    ,1),
(9, '10/6/2019 00:11:02'    ,1),
(10, '10/6/2019 00:11:03'   ,1),
(11, '10/6/2019 00:11:04'   ,0),
(12, '10/6/2019 00:11:05'   ,1),
(13, '10/6/2019 00:11:06'   ,1),
(14, '10/6/2019 00:11:07'   ,1),
(15,'10/6/2019 00:11:15'    ,1)

TIA

这是孤岛问题的变体。这是使用 window 函数(在 MySQL 8.0 中可用)解决它的一种方法:

select 
    t.*,
    case when 
        alarm = 1 
        and row_number() over(partition by alarm, rn1 - rn2 order by TimeStamp) = 1
    then timestampdiff(
            second,
            min(TimeStamp) over(partition by alarm, rn1 - rn2),
            max(TimeStamp) over(partition by alarm, rn1 - rn2)
        )
    end out
from (
    select
        t.*,
        row_number() over(order by TimeStamp) rn1,
        row_number() over(partition by alarm order by TimeStamp) rn2
    from mytable t
) t

内部查询在整个 table 和共享同一警报的记录的分区中对记录进行排名。排名之间的差异为您提供了每条记录所属的组。

然后,外部查询用 alarm = 1 标识每个组中的第一条记录,并计算组中第一条记录和最后一条记录之间的差异,以秒为单位。