2016-07-20 5 views
0

Я пытаюсь создать отчет, который покажет, как долго работает автоматическая спринклерная система. Система состоит из нескольких спринклеров, каждый из которых отслеживает только сам себя, а затем отправляет эту информацию в базу данных. Моя проблема заключается в том, что у каждого спринклера есть свое собственное время выполнения (IE, если 5 спринклеров все работали одновременно в течение 10 минут, оно сообщило бы об общем времени работы 50 минут), и я хочу знать только чистую сумму прогона время - в этом примере это будет 10 минут.Как найти, где существует общее состояние

База данных состоит из метки времени и булева, где она записывает отметку времени каждый раз, когда спринклер закрыт или выключен (состояние включения/выключения указано 1/0 логического значения).

Таким образом, чтобы выяснить общее время в сети, которое было в каждый день - независимо от того, был ли он одним спринклером, или все из них - мне нужно проверить базу данных на временные рамки, где никакие спринклеры не были вообще повернуты (или где ЛЮБОЙ спринклер вообще был включен). Я думаю, что начало запроса будет выглядеть как

SELECT * FROM MyTable 
WHERE MyBoolean = 0 
AND [ ... ] 

Но я не уверен, что условные операторы, которые будут следовать и будут, как проверить метки времени.

Есть ли запрос, который я могу отправить в базу данных, которая сообщит об этом формате информации?

EDIT:

Вот таблица данные записываются - это буквальна только имя, логическая и дата и время, когда булево был изменен, и это вся база данных enter image description here

+1

показать вашу схему .. правильный образец данных и ожидаемый результат – scaisEdge

+0

Это 1-таблица базы данных, поэтому нет никаких связей с другими таблицами для схемы, и ожидаемые результаты, которые я чувствовал, были объяснены в вопросе: я пытаюсь чтобы получить возврат любого случая, когда все распылители были установлены на 0 одновременно (я не очень хорош с базами данных, поэтому, возможно, в вашем запросе чего-то не хватает) –

+2

Ищите «интервальную упаковку». –

ответ

0

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

timestamp on/off 
07:00:05 1 
07:03:10 1 
07:05:45 -1 

то есть, как соответствие событий по порядку; которые спринклеры, на которые они ссылаются, не имеют значения. (Я изменил нули -1 по причинам, которые станут очевидными в момент Вы можете сделать это с помощью «(2 * стоимость) - 1».)

Теперь поместите беговую всего вместе:

select a.timestamp, (SELECT SUM(a.on_off) 
        FROM sprinkler_events b 
        WHERE b.timestamp <= a.timestamp) as run_total 
    from sprinkler_events a 
order by a.timestamp; 

где sprinkler_events - это преобразованные данные, перечисленные выше. Это даст вам:

timestamp run_total 
07:00:05  1 
07:03:10  2 
07:05:45  1 

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

+0

Черт, мне нравится этот ответ. Мне потребовалась минута или две, чтобы обвести вокруг себя голову, но, как только я сбил свои возражения, это пятно. Я пытался выяснить, как «какие спринклеры, на которые они ссылаются, не имеют значения», и это потому, что вы не можете дважды включить один и тот же спринклер, сначала его нужно отключить. Изменяет столбец bool на int/smallint, но полностью стоит. Хороший ответ. –

0

Возможно, вы захотите найти, все ли спринклеры в настоящее время выключены. Например:

SELECT COUNT (DISTINCT s._NAME) AS sprinkers_currently_off 
FROM (
    SELECT 
     _NAME, 
     _VALUE, 
     _TIMESTAMP, 
     ROW_NUMBER() OVER (PARTITION BY _NAME ORDER BY _TIMESTAMP DESC, _VALUE) AS latest_rec 
    FROM sprinklers 
    ) s 
WHERE 
    _VALUE = 0 
    AND latest_rec = 1 

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

Вы можете изменить это, применив диапазон дат к внутреннему запросу, если вы хотите заглянуть в прошлое, но это должно привести вас к правильному пути.