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
...

我想获得每种 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/

相关文章:

mysql - 使用mysqlimport时不能显示警告吗?

MySQL 函数 REPLACE 抛出语法错误

mysql - 内连接 2 个表并计算每个表中外键的出现次数

mysql - 在 mysql 的查询中不使用 DISTINCT 的查询形成中的逻辑错误

sql - 不能在 clojure 中使用 jdbc

mysql - 如何计算 MySQL 查询中两个哈希之间的差异?

mysql - Jboss连接池未连接数据库

php - 尝试将 SQL 结果导入数组 : Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted

sql - 使用 group by 和多个列的行号

mysql - SQL查询以获取2个日期有效时间表之间的数据