Эффективный выбор сопоставимых строк из таблицы

1
6

У меня есть таблица записи данных с двух датчиков:

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;

Яков
Вопрос задан23 августа 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.