我在处理要从数据库表中获取的内容时遇到了问题。
表格是这样的
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
...
我想获得每种 Action 的平均时间间隔(下一个 Action 的开始时间减去这个 Action 的开始时间)。
我应该怎么做?
编辑:
有一个规则。如果间隔大于 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
最佳答案
我认为无法避免对数据进行一些重新格式化,为此您可以使用临时表。
注意:我创建了一个以整数而不是时间作为源数据的表,以避免所有时间格式计算,但它确实是一样的。
我创建的源数据是:
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 的最后一个间隙被忽略。
关于mysql - SQL查询以获取相邻记录之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178373/