SQL Query以获取相邻记录之间的差异

时间:2011-03-03 08:41:14

标签: 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
...

我希望得到每种动作的平均时间差(下一个动作的开始时间减去此动作的开始时间)。

我怎么想这样做?

编辑:

有规则。如果间隔大于1小时,则不计入平均值。因此,它不等于整个时间间隔除以间隔的数量。所以它变成了(仅适用于A)

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

2 个答案:

答案 0 :(得分: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;

结果是:

type   avg_gap
 A     2.5
 B     1.5

编辑:根据编辑中的新规则:我的规则不是计算大于5的差距(正如您在最终查询的WHERE子句中所看到的那样)。因此,忽略了B类的最后一个差距。

答案 1 :(得分:0)

好的,即使问题与MySQL: Average interval between records中的问题不同,其他有效的解决方案也适用于您,例如:

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

上述查询中有一些假设:

  • startTime类型为TIME
  • 每种类型都是唯一的(没有两个事件同时开始)
  • 它实际上也排除了任何一个小时的间隔