sql >> Database teknologi >  >> RDS >> Mysql

SQL-forespørgsel for at finde forskel mellem tilstødende poster

Jeg tror, ​​der ikke er nogen udenom en lille omformatering af dataene, og til det kan du bruge en midlertidig tabel.

Bemærk :Jeg oprettede en tabel med heltal i stedet for gange som kildedata for at undgå alle tidsformatberegninger, men det er virkelig det samme.

Kildedataene, jeg oprettede, er:

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

Så er scriptet du skal bruge for at få dit svar:

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;

Og resultatet er:

type   avg_gap
 A     2.5
 B     1.5

EDIT: I henhold til din nye regel i redigeringen:Min regel er ikke at beregne mellemrum større end 5 (som du kan se i Hvor klausul i den endelige forespørgsel). Derfor blev det sidste hul af type B ignoreret.



  1. Fejl #1442 MySQL - laver en trigger

  2. Hvorfor bruge SELECT FOR UPDATE?

  3. Hvordan får jeg en liste over alle tabeller i en database ved hjælp af TSQL?

  4. Brug af SUM, så NULL i kolonner gør sum NULL