sql >> Databasteknik >  >> RDS >> Mysql

SQL-fråga för att få skillnad mellan angränsande poster

Jag tror att det inte går att komma undan lite omformatering av data, och för det kan du använda en temporär tabell.

Obs :Jag skapade en tabell med heltal istället för tider som källdata för att undvika alla tidsformatberäkningar, men det är egentligen samma sak.

Källdata jag skapade är:

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

Då är skriptet du behöver använda för att få ditt 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;

Och resultatet är:

type   avg_gap
 A     2.5
 B     1.5

EDIT: Enligt din nya regel i redigeringen:Min regel är att inte beräkna luckor större än 5 (som du kan se i WHERE klausul i den slutliga frågan). Därför ignorerades den sista luckan av typ B.



  1. Hur implementerar man det här programmet för import till en tabell utan att använda INSERT INTO SELECT-satsen?

  2. Hämtar mysql-resultat av objektuppdatering

  3. Spotlight Cloud-stöd för Azure SQL DB Announcement (förhandsgranskning)

  4. Xampp MySQL startar inte - "MYSQL startar inte på XAMPP 3.2.1 version..."