Эспер: создать окно для событий, которые происходят после другого события

Мне нужна средняя скорость (датчик = 1) при разных настройках мощности 1-10 (датчик = 2). Я не хочу, чтобы скорости от датчика 1 включались в средний расчет, если они произошли до изменения настройки (датчик = 2).

Например. power_setting=1, скорость=50, скорость=60, power_setting=2, скорость=100, скорость=120

Если я взял временное окно около power_setting = 2, то оно может включать скорость для power_setting = 1.

Как я могу явно указать esper для расчета только со значениями, которые произошли после изменения настроек питания.

Вот мой текущий скрипт:

CREATE window SpeedWindow.win:time_batch(30 sec) as (speed double, power_setting int);

INSERT into SpeedWindow
SELECT
    speedEvent.value as speed,
    powerSetting.value as power_setting
FROM
    Sensors(id = 1).std:lastevent() as speedEvent,
    Sensors(id = 2).std:lastevent() as powerSetting;

INSERT into Output
SELECT
    case
        when SpeedWindowEvent.power_setting = 1 then 4154
        when SpeedWindowEvent.power_setting = 2 then 4155
        ... etc ...
    end as id,
    avg(SpeedWindowEvent.speed) as value
FROM
    SpeedWindow as SpeedWindowEvent
GROUP BY
    SpeedWindowEvent.power_setting;

person Adam Waring    schedule 24.09.2020    source источник
comment
Я пока этого не понимаю. Для событий s2=1, s1=50, s1=60, s2=2, s1=100, s1=120, какие из них следует игнорировать и почему?   -  person user650839    schedule 24.09.2020
comment
Я даю их в порядке их возникновения. Если событие скорости (s1) происходит до настройки мощности (s2), это не имеет значения при расчете среднего значения при настройке мощности = X. Поэтому мне нужна средняя скорость при всех настройках мощности, но только для данных скорости, которые происходят после активации этой настройки мощности. .   -  person Adam Waring    schedule 24.09.2020
comment
Итак, настройки скорости — это события s1, а настройки мощности — это события s2, верно? Почему бы просто не назвать их мощностью и скоростью? то есть вставьте в Speed ​​select * from Sensor(id=1) и вставьте в Power select * from Sensor(id=2) очень помогает. Для последовательности событий скорость = 1, мощность = 50, мощность = 60, скорость = 2, мощность = 100, мощность = 120, что является выходом и при каком событии и какие события скорости игнорируются .....?   -  person user650839    schedule 24.09.2020
comment
поэтому для скорости 1 в этой последовательности: он должен рассчитывать мощность = 50 и мощность = 60, а для скорости 2 мощность = 100 и мощность = 120. Таким образом, только для событий, которые происходят после активации настройки и до ее повторного изменения.   -  person Adam Waring    schedule 24.09.2020


Ответы (1)


На основе комментариев, разъясняющих вариант использования. Создайте контекст, который инициирует и завершает событие скорости.

// make it easy to read, takes no CPU at all
insert into Speed select * from Sensor(id=1);
insert into Power select * from Sensor(id=2);

create context SpeedSession initiated by Speed terminated by Speed;
context SpeedSession select avg(...) from Power;
person user650839    schedule 24.09.2020