Я думаю, что нельзя избежать небольшого переформатирования данных, и для этого вы можете использовать временную таблицу.
Примечание : я создал таблицу с целыми числами вместо времени в качестве исходных данных, чтобы избежать всех вычислений формата времени, но на самом деле это то же самое.
Исходные данные, которые я создал:
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. был проигнорирован.