Sqlite-запрос по метке времени и значению - PullRequest
1 голос
/ 12 июля 2020

У меня есть таблица Sqlite со следующими строками:

  • id: int PK autoincrement
  • timestamp: int value NOT NULL. Отметка времени вставки БД
  • value: значение int NOT NULL. Возможные значения [0-4].

Я хочу запросить базу данных, чтобы узнать, совпадают ли все значения в базе данных для регистров, содержащихся в течение 60 секунд до данной временной метки value . Например:

id | timestamp  | value
1  | 1594575090 |   1
2  | 1594575097 |   1
3  | 1594575100 |   1
4  | 1594575141 |   2
5  | 1594575145 |   2
6  | 1594575055 |   3
7  | 1594575060 |   4

В этом случае, если я сделал ожидаемый запрос для регистров, содержащихся за 60 секунд до регистра 3 (включая регистр 3), он должен запросить, если значения регистров [1,2, 3] совпадают, что должно return 1.

С другой стороны, если этот запрос был выполнен с регистром 7, он сравнит value регистров [4,5,6,7] и должно быть return 0, поскольку это значение не одинаково для трех из них.

Есть предположения, как я могу выполнить этот запрос?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Хммм. . . Я думаю, что logi c, который вы описываете:

select ( min(value) = max(value) ) as all_same
from t cross join
     (select t.*
      from t
      where t.id = ?
     ) tt
where t.timestamp < tt.timestamp and
      t.timestamp >= tt.timestamp - 60
1 голос
/ 12 июля 2020

Думаю, вам нужно это:

select count(distinct value) = 1 result
from tablename
where id <= ? 
and timestamp - (select timestamp from tablename where id = ?) <= 60;

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

and abs(timestamp - (select timestamp from tablename where id = ?)) <= 60;

См. demo .

...