Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL / MariaDB:Wie finde ich Lücken in zeitbasierten Daten?

Ein Ansatz könnte darin bestehen, zuerst eine Unterabfrage durchzuführen und jeden Datensatz mit dem Datensatz mit dem nächstgrößeren Zeitstempel zu paaren. Fragen Sie das dann ab und geben Sie alle Datensätze mit einer ausreichend großen Lücke zurück.

SELECT
    DateTime AS GapStart,
    NextDateTime AS GapEnd,
    TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) AS SizeInSecond
FROM
(
    SELECT DateTime, Value,
        (SELECT MIN(DateTime) FROM #time t2
         WHERE t2.DateTime > t1.DateTime) AS NextDateTime
    FROM #time t1
) t
WHERE
    TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) > 5;   -- or whatever threshhold you want

Demo

ADD ON zur ursprünglichen Antwort

Wenn DateTime wächst ständig, eine Geschwindigkeitsverbesserung kann erreicht werden, indem das interne SELECT:

geändert wird
SELECT
    DateTime AS GapStart,
    NextDateTime AS GapEnd,
    TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) AS SizeInSecond
FROM
(
    SELECT DateTime, Value,
        (SELECT DateTime FROM #time t2
         WHERE t2.DateTime > t1.DateTime LIMIT 1) AS NextDateTime
    FROM #time t1
) t
WHERE
    TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) > 5;