sql >> Database >  >> RDS >> Mysql

SQL-query om verschil tussen aangrenzende records te krijgen

Ik denk dat er geen ontkomen aan is een kleine herformattering van de gegevens, en daarvoor kun je een tijdelijke tabel gebruiken.

Opmerking :Ik heb een tabel gemaakt met gehele getallen in plaats van tijden als brongegevens om alle tijdnotatieberekeningen te vermijden, maar het is eigenlijk hetzelfde.

De brongegevens die ik heb gemaakt zijn:

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

Dan is het script dat je moet gebruiken om je antwoord te krijgen:

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;

En het resultaat is:

type   avg_gap
 A     2.5
 B     1.5

BEWERKEN: Volgens uw nieuwe regel in de bewerking:Mijn regel is om geen gaten groter dan 5 te berekenen (zoals u kunt zien in de WHERE clausule van de laatste vraag). Vandaar dat de laatste opening van type B werd genegeerd.



  1. Hoe converteer je een interval zoals 1 dag 01:30:00 in 25:30:00?

  2. Onjuiste integerwaarde '' voor een MySQL-kolom die integer is en null toestaat?

  3. PHP strtotime() functie fout met 1 uur?

  4. StrongLoop:EmbedsMany vs hasMany en behoren tot