SQL-запрос данных на основе разницы во времени - PullRequest
0 голосов
/ 31 августа 2018

У меня проблема с базами данных sql.

А именно, я хочу создать запрос, получить среднее значение определенного столбца измерения, но только для тех последующих строк, у которых разница во времени составляет менее 60 секунд.

Пример таблицы будет выглядеть примерно так:

| ID | Measurement | Timestamp | 
| 1  | 0.564       | 1535648400|
| 2  | 0.456       | 1535648459|
| 3  | 0.785       | 1535648501|
| 4  | 0.321       | 1535648620|

Разница между временными метками будет приемлемой для всех строк, за исключением между 3 и 4, где они отличаются более 60 секунд. В этом случае среднее значение будет занимать не строку с идентификатором 4, а только первые 3 строки.

В первую очередь я планирую написать этот запрос для базы данных InfluxDB, но в целом запрос также для структурного SQL также будет работать.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я хотел бы добавить дополнительный ответ поверх В.Г., который я нашел очень хорошим. По соображениям производительности вы можете перефразировать запрос и добавить хороший индекс, например:

create index ix1 on table (timestamp);

Тогда запрос может быть:

SELECT t1.ID, t1.measurement, t1.timestamp,  avg(t2.measurement) 
FROM table t1, table t2
WHERE t2.timestamp >= t1.timestamp
  AND t2.timestamp < t1.timestamp + 60*1000
GROUP BY t1.ID, t1.measurement, t1.timestamp

Иногда простая «перефразировка запроса» может существенно повлиять на производительность.

0 голосов
/ 31 августа 2018

Присоедините таблицу к себе, используя внутреннее соединение с условием временной метки, чтобы включить все записи в течение 60 секунд. Стандартный SQL ниже (необходимо настроить для InfluxDB):

SELECT t1.ID, t1.measurement, t1.timestamp,  avg(t2.measurement) 
FROM table t1, table t2
WHERE t1.timestamp <= t2.timestamp
  AND t1.timestamp + 60*1000 > t2.timestamp
GROUP BY t1.ID, t1.measurement, t1.timestamp
...