Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta SQL para obter diferença entre registros adjacentes


Acho que não há como escapar de uma pequena reformatação dos dados e, para isso, você pode usar uma tabela temporária.

Observação :criei uma tabela com inteiros em vez de horas como os dados de origem para evitar todos os cálculos de formato de hora, mas é realmente a mesma coisa.

Os dados de origem que criei são:
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');

Então o script que você precisa usar para obter sua resposta é:
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;

E o resultado é:
type   avg_gap
 A     2.5
 B     1.5

EDITAR: De acordo com sua nova regra na edição:Minha regra é não calcular gaps maiores que 5 (como você pode ver no WHERE cláusula da consulta final). Portanto, a última lacuna do tipo B foi ignorada.