Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête SQL pour obtenir la différence entre les enregistrements adjacents

Je pense qu'il n'y a pas moyen d'échapper à un petit reformatage des données, et pour cela, vous pouvez utiliser une table temporaire.

Remarque  :J'ai créé une table avec des entiers au lieu d'heures comme données source pour éviter tous les calculs de format d'heure, mais c'est vraiment pareil.

Les données source que j'ai créées sont :

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

Ensuite, le script que vous devez utiliser pour obtenir votre réponse est :

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;

Et le résultat est :

type   avg_gap
 A     2.5
 B     1.5

MODIF : Selon votre nouvelle règle dans l'édition :Ma règle est de ne pas calculer les écarts supérieurs à 5 (comme vous pouvez le voir dans le WHERE clause de la requête finale). Par conséquent, le dernier espace de type B a été ignoré.