2017-02-04 17 views
0

У меня есть sqlite3 БД с последующей компоновки 3 колонкиАвтоматически рассчитывать DB записей с интервалом и записи периодически приводит к агрегации таблицы

typ (1=gas or 0=electrical power) | time (seconds since epoch) | value (float) 

там, я документировать события от газового счетчика, который выстреливает через каждые 10 л потребляемой газ. Это (когда активируется газовый нагрев) через каждые ~ 20 секунд. Значение, записанное вместе с меткой времени, равно 0 (ноль).

Я хочу автоматически заполнить таблицу агрегатов счетчиком всех записей в течение 10 минут.

Я имел успех с этим запросом, чтобы получить отсчеты в пределах интервалов:

select time/600*600+600 _time, count(*) _count 
from data 
where typ = 1 and value = 0 
group by _time 
order by _time 

Но как бы я достигнуть следующий:

  • выполнить этот запрос регулярно проверяться через каждые 10 минут (или на каждом INSERT с TRIGGER?) В xx: 10/xx: 20/xx: 20/...
  • записать итоговый счет только за последние 10 минут в таблицу агрегации вместе с временем окончания интервала.

Я, конечно, мог бы сделать это с помощью программы (например, PHP), но я предпочел бы только решение с БД, если это возможно.

Спасибо за любую помощь.

ответ

0

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

create trigger after insert on data 
begin 
    insert or ignore into aggregateData(startTime, counter) values ((new.time/600) * 600, 0); 
    update aggregateData set counter = counter + 1 where startTime = (new.time/600) * 600; 
end; 
0

Я думаю, что я нашел простое решение, которое в конце концов создает тот же результат:

Просто превратить мой совокупный запрос в представление:

CREATE VIEW _aggregate as 
select time/600*600+600 _time, count(*) _count 
from data 
where typ = 1 and value = 0 
group by _time 
order by _time 

Это дает мне точно мое желаемое результат, если я сделаю a:

select * from _aggregate 

Это достаточно, чтобы иметь агрегированные значения во время выполнения и нет t, чтобы сохранить их. Или вы видите существенную разницу в своем решении?