У меня есть таблица записи данных с двух датчиков:
Measurement(sensorName,measureName,dateTime ,чтение)
Я запрашиваю эти данные в представлении inColumns
с помощью , чтобы получить более широкую таблицу, например:
В результате получается таблица показаний, сопоставляющих кислород и температуру:
Моя проблема заключается в следующем: каждый датчик измеряет состояние воды (температуру, растворенный кислород) каждые 12 минут, но эти два датчика не синхронизированы. Итак, двое сравнивают результаты двух датчиков, которые я ищу "похожие" разы – одинаковое значение, с разницей менее 6 минут; которые всегда будут двумя ближайшими показаниями двух датчиков.
Я использую почти тот же метод, что и выше, чтобы получить наиболее близкие показания:
Но база данных вычисляет разницу дат для каждого пара записей, поэтому O(N^2) для N записей. В имеющемся у меня небольшом наборе данных (по 2000 показаний каждого) выполнение запроса занимает несколько минут. Тем не менее, поскольку время индексируется и известно, что запись с каждого датчика происходит каждые 12 минут, должна быть возможность выполнить этот запрос за линейное время O(N).
Есть ли способ переписать запрос для выполнения в линейном времени? Я могу сделать это на других языках, кроме SQL, но поскольку данные находятся в реляционной базе данных, я бы предпочел использовать SQL-запрос, если это можно сделать эффективно.
SELECT do, temp, t.dateTime, t.sensorName
FROM (SELECT reading AS do, dateTime, sensorName FROM measurement WHERE measureName="DOppm") AS ppm,
(SELECT reading AS temp, dateTime, sensorName FROM measurement WHERE measureName="Temperature") AS t
WHERE ppm.dateTime=t.dateTime and ppm.sensorName=t.sensorName
ORDER BY ppm.dateTime, ppm.sensorName;
do | temp | dateTime | sensorName
10 | 15 | 2024-08-20 16:59:00 | sensor22
11 | 15 | 2024-08-20 16:56:00 | sensor44
...
SELECT s22.doppm, s44.doppm, s22.temp, s44.temp, s22.dT
FROM (SELECT doppm, temp, t.dateTime as dT from dataInColumns where sensorName="sensor22") AS s22,
(SELECT doppm, temp, t.dateTime as dT from dataInColumns where sensorName="sensor44") AS s44
where Abs(DateDiff("n",s22.dT,s44.dT)) < 6
ORDER BY s22.dateTime;