sql >> Base de Datos >  >> RDS >> Mysql

Consulta SQL para obtener la diferencia entre registros adyacentes

Creo que no se puede escapar de un pequeño reformateo de los datos, y para eso puede usar una tabla temporal.

Nota :Creé una tabla con números enteros en lugar de tiempos como datos de origen para evitar todos los cálculos de formato de tiempo, pero en realidad es lo mismo.

Los datos de origen que creé son:

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');

Luego, el script que debe usar para obtener su respuesta es:

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;

Y el resultado es:

type   avg_gap
 A     2.5
 B     1.5

EDITAR: De acuerdo con su nueva regla en la edición:Mi regla es no calcular espacios mayores a 5 (como puede ver en el WHERE cláusula de la consulta final). Por lo tanto, se ignoró el último espacio de tipo B.