sql >> Databáze >  >> RDS >> Mysql

SQL dotaz pro získání rozdílu mezi sousedními záznamy

Myslím, že není možné uniknout malému přeformátování dat a k tomu můžete použít dočasnou tabulku.

Poznámka :Vytvořil jsem tabulku s celými čísly místo časů jako zdrojovými daty, abych se vyhnul všem výpočtům formátu času, ale je to opravdu to samé.

Zdrojová data, která jsem vytvořil, jsou:

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

Potom skript, který potřebujete k získání odpovědi, je:

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;

A výsledek je:

type   avg_gap
 A     2.5
 B     1.5

UPRAVIT: Podle vašeho nového pravidla v úpravě:Moje pravidlo není počítat mezery větší než 5 (jak můžete vidět v WHERE klauzule závěrečného dotazu). Poslední mezera typu B byla tedy ignorována.



  1. Mysql zobrazuje náhodné 4 uživatele s více než 5 články

  2. Volání funkce definované SQL v C#

  3. Načítání dat z datového rámce v R do více tabulek v MySQL se stejným názvem, ale jiným názvem schématu

  4. MySql Fulltextové vyhledávání