Mysql 获取相邻记录之间差异的SQL查询

Mysql 获取相邻记录之间差异的SQL查询,mysql,sql,Mysql,Sql,我想从数据库表中获取的内容有问题 这张桌子看起来像这样 startTime endTime type 1:00 1:02 A 1:20 1:30 A 3:45 3:50 A 1:30 1:40 B 2:30 2:31 A 3:00 3:01 A ... 我想得到下一个动作的平均时间间隔starttime减去每种动作的starttime 我该怎么做呢 编辑: 有一条规则。如果间隔

我想从数据库表中获取的内容有问题

这张桌子看起来像这样

startTime  endTime type
1:00       1:02    A    
1:20       1:30    A
3:45       3:50    A
1:30       1:40    B
2:30       2:31    A
3:00       3:01    A
...
我想得到下一个动作的平均时间间隔starttime减去每种动作的starttime

我该怎么做呢

编辑:

有一条规则。如果间隔大于1小时,则不计入平均值。因此,它不等于整个时间间隔除以间隔数。所以它变成了,只是为了一个

startTime  endTime type
1:00       1:02    A    
1:20       1:30    A
2:30       2:31    A
3:00       3:01    A
3:45       3:50    A
计算应该是 1:20-1:00=20分钟记录此记录 2:30-1:20=70分钟丢弃此记录 3:00-2:30=30分钟拿着这个 3:45-3:00=45分钟拿着这个


最终结果应该是20+30+45/3

我认为对数据进行一点重新格式化是不可避免的,为此,您可以使用临时表

注意:我创建了一个以整数代替时间作为源数据的表,以避免所有时间格式的计算,但实际上是一样的

我创建的源数据是:

CREATE TABLE `table` (
`start` INT(11) NOT NULL,
`end` INT(11) NOT NULL,
`type` VARCHAR(6));

INSERT INTO `table` VALUES
(1,3,'A'),
(5,7,'A'),
(6,10,'A'),
(2,6,'B'),
(3,4,'B'),
(5,11,'B'),
(12,13,'B');
然后,您需要使用以下脚本来获得答案:

DROP TABLE IF EXISTS temp;
CREATE TABLE temp (
id int(100) AUTO_INCREMENT,
start int(11) NOT NULL,
type VARCHAR(6),
PRIMARY KEY id (id));

INSERT INTO temp(start, type) 
SELECT start, type FROM table
ORDER BY type, start;

SELECT t1.type, AVG(t1.start - t2.start) AS avg_gap 
FROM temp t1
JOIN temp t2 ON t1.type = t2.type AND t1.id = (t2.id + 1)
WHERE t1.start - t2.start < 5
GROUP BY t1.type;

编辑:根据编辑中的新规则:我的规则是不计算大于5的间距,如您在最终查询的WHERE子句中所看到的。因此,类型B的最后一个间隙被忽略。

好的,尽管问题与其他有效解决方案中的问题不同,但它确实适用于您,例如:

SELECT type, AVG(minutes)
FROM
(SELECT type, EXTRACT(MINUTE FROM TIMEDIFF(t2.startTime, MAX(t1.startTime))) minutes
FROM table t1 JOIN
     table t2 ON t1.type = t2.type AND 
                 t1.startTime > SUBTIME(t2.startTime, '01:00:00') AND 
                 t1.startTime < t2.startTime
GROUP BY type, t2.startTime
) x
GROUP BY type
上述查询中有一些假设:

开始时间类型是时间 每种类型都是唯一的,没有两个事件同时启动 实际上,它也排除了整整一小时的任何间隔
下一个动作意味着下一个在时间上还是下一个在表格中?对于@Unreason edited中类似/相同的问题,有一个优雅的解决方案。这个问题和那个不同。你能澄清一下编辑吗?假设从计算平均值的样本集中删除任何大于1小时的时间间隔是正确的,还是忽略较大时间间隔的小时部分,或者做类似的事情?
SELECT type, AVG(minutes)
FROM
(SELECT type, EXTRACT(MINUTE FROM TIMEDIFF(t2.startTime, MAX(t1.startTime))) minutes
FROM table t1 JOIN
     table t2 ON t1.type = t2.type AND 
                 t1.startTime > SUBTIME(t2.startTime, '01:00:00') AND 
                 t1.startTime < t2.startTime
GROUP BY type, t2.startTime
) x
GROUP BY type