我遇到了一些我想从数据库表中获取的东西。
表格如下所示
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
答案 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
上述查询中有一些假设: