Рекомендации по SQL-запросу для поиска записей, которые включены в диапазон времени - PullRequest
0 голосов
/ 06 мая 2019

ИЗМЕНЕНО для включения сценария «CREATE TABLE» для тех, кто нуждается в меньшем количестве абстракций (см. Нижнюю часть вопроса)программа », которая содержит время запуска / остановки, и каждая программа может запускать одну или несколько« станций »(клапаны или разбрызгиватели или что-то еще), которые работают со своими собственными временами запуска / остановки, контролируемыми« программой ».См. Блок ниже для приблизительного примера с последующим объяснением.

|<---- Program 1 ----------------------------------------------->|
|<-- Station 1 -->|   |<---- Station 2 ---->|<---- Station 3 --->|

|<---- Program 2 ---------------------------------------->|
          |<---- Station 4 ---->|<---- Station 5 -->|

|<---- Program 3 --->|
|<---- Station 6 -->|

                                |<-- Master Pump Fail Alarm -->|

В вышеприведенном «псевдо-расписании» программа 1 имеет 3 работающих станции, а программа 2 - 2 работающих.Программа 3 имеет одну станцию.Главный насос выходит из строя именно тогда, когда станция 5 в программе 2 запускается, но сигнал тревоги заканчивается (может быть, он был исправлен?) После завершения программы 2, но все еще в течение времени выполнения программы 1. Стрелки показывают время запуска и остановки, а также диапазон времени выполнения события..

По сути, я пытаюсь выяснить алгоритм предложения WHERE в соответствии с чем-то вроде:

SELECT stuff WHERE "a program's or station's running time occurred *during* the alarm period (alarm.begintime to alarm.endtime in the schema below)".  

Результат для этого с использованием приведенного выше примера расписания должен вернуть списокзаписи, которые включают Программу 1 со Станциями 2 и 3 и Программу 2 только со Станцией 5.

Время начала и окончания для Программ, Станций и Сигналов тревоги записывается в базу данных в EPOCH / UNIXTIME.Ядром базы данных является PostgreSQL 9.6.5 на x86_64-pc-linux-gnu.

Если что-то нуждается в дополнительных разъяснениях, пожалуйста, спросите.Заранее благодарим за любые лакомые кусочки, помогающие решить проблему.

Схема ниже должна создать макет, подобный блоку визуализации выше:

CREATE TABLE test(
 oid PRIMARY KEY,
 itemid INTEGER,
 itemtype VARCHAR (255),
 begintime INTEGER,
 endtime INTEGER
);

INSERT INTO test VALUES (1, 1, 'Program', 1556809522, 1556809680);
INSERT INTO test VALUES (2, 1, 'Station', 1556809522, 1556809560);
INSERT INTO test VALUES (3, 2, 'Station', 1556809620, 1556809642);
INSERT INTO test VALUES (4, 3, 'Station', 1556809642, 1556809680);

INSERT INTO test VALUES (5, 2, 'Program', 1556809522, 1556809670);
INSERT INTO test VALUES (6, 4, 'Station', 1556809541, 1556809630);
INSERT INTO test VALUES (7, 5, 'Station', 1556809630, 1556809660);

INSERT INTO test VALUES (8, 3, 'Program', 1556809522, 1556809618);
INSERT INTO test VALUES (9, 6, 'Station', 1556809522, 1556809617);

INSERT INTO test VALUES (10, 1, 'Alarm', 1556809630, 1556809675);
...