Нахождение всего колебания в наборе данных - PullRequest
1 голос
/ 03 марта 2011

У меня есть таблица исторических данных для набора танков в базе данных MySQL. Я хочу найти колебания в объеме содержимого бака более 200 галлонов / час. Мой SQL-оператор до сих пор:

SELECT t1.tankhistid as start, t2.tankhistid as end
FROM
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t1
INNER JOIN
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t2
    ON t1.tankid = t2.tankid AND t1.curtime < t2.curtime
WHERE TIMESTAMPDIFF(HOUR, t1.curtime, t2.curtime) < 1 AND ABS(t1.vol - t2.vol) > 200
ORDER BY t1.tankhistid, t2.tankhistid

В приведенном выше коде curtime - это временная метка на момент вставки записи, tankhistid - первичный ключ целочисленной таблицы, tankid - идентификатор отдельного резервуара, а vol - чтение объема.

Возвращает слишком много результатов, поскольку данные собираются каждые 5 минут, а колебания могут занимать часы (несколько строк с одинаковым идентификатором в конце и затем в столбце начала) или чуть более 10 минут (несколько строк с одинаковым началом и концом Я бы). Пример вывода:

7514576,7515478
7515232,7515478
7515314,7515478
7515396,7515478
7515478,7515560
7515478,7515642
7515478,7515724

Обратите внимание, что все эти строки должны быть только одним: 7514576,7515724. Запрос занимает 4 минуты всего за один день данных танка, так что любое ускорение также будет большим. Я предполагаю, что есть способ взять текущий запрос и использовать его как подзапрос, но я не уверен, как выполнить фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...