每当 MySQL 中的行之间的值发生变化时,如何找到两个带时间戳的行之间的差异
How to find the difference between two timestamped rows whenever value changes between rows in MySQL
我的数据集如下所示:
D 列中给出的输出推导如下:
针对索引 2 的输出:索引 3 中的时间戳 - 索引 2 中的时间戳
针对索引 6 的输出:索引 10 中的时间戳 - 索引 6 中的时间戳
针对索引 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
标识每个组中的第一条记录,并计算组中第一条记录和最后一条记录之间的差异,以秒为单位。
我的数据集如下所示:
D 列中给出的输出推导如下:
针对索引 2 的输出:索引 3 中的时间戳 - 索引 2 中的时间戳
针对索引 6 的输出:索引 10 中的时间戳 - 索引 6 中的时间戳
针对索引 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
标识每个组中的第一条记录,并计算组中第一条记录和最后一条记录之间的差异,以秒为单位。