Чтобы избежать проблем, обсуждаемых в комментариях, где математическое временное окно (с использованием оператора модуля) может произвольно отсекать / разбивать показания из одного и того же пакета, вместо этого мы можем проверять соседние записи, чтобы получить временную задержку между последовательными показаниями.Детали вопроса подразумевают, что показания в одном и том же пакете записей, вероятно, будут происходить в очень короткое время (в течение пары секунд) по сравнению с задержкой между пакетами (~ 40 секунд).Таким образом, чтобы получить одно чтение на пакет, выберите только те записи, которые имеют длительную задержку для следующей записи, где-то между 2 и 40 секундами ... что я несколько произвольно выбираю 10.
К счастью, sqlite поддерживает оконные функции , которые позволяют сравнивать соседние строки с использованием базовых запросов SQL - не нужно ничего писать в сценарии вне SQL.
WITH sensorExt AS (
SELECT *,
strftime('%s', insDate) AS tsec --Convert to seconds since 1970-01-01 00:00:00
FROM sensor )
SELECT *
FROM -- Must use subquery in order to apply WHERE conditions to window function results
(SELECT sensorExt.*,
(lead(tsec) OVER (ORDER BY insDate ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING))
- tsec as postspan -- Calculate difference between following row seconds
FROM sensorExt
ORDER BY sensorExt.insDate) AS sensorExt2
WHERE
-- Only keep rows which are at end of "burst" with large delay to next record
-- coalesce() is called to handle/include the null value of the last record.
coalesce(postspan, 11) > 10
Примечание 1 : я предпочитаюиспользуйте общие табличные выражения (CTE; предложение WITH) вместо подзапросов, когда это возможно, но, похоже, есть ошибка с оконными функциями (т.е. предложение OVER) в CTE, поэтому япришлось вернуться к подзапросу.В противном случае я бы использовал серию таблиц CTE вместо того, чтобы смешивать конструкции.
Примечание 2 : Этого также можно достичь без оконных функций, используя стандартные агрегированные SQL-запросы, но я думаю, что этодля получения разницы между соседними строками потребуется как минимум набор из 3 вложенных подзапросов.