Esper:为在另一个事件之后发生的事件创建窗口

问题描述

我想要在不同的功率设置1-10(sensor = 2)下的平均速度(sensor = 1)。我不希望传感器1的速度出现在设置更改(sensor = 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;

解决方法

基于阐明用例的注释。创建一个在速度事件上启动和终止的上下文。

// 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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...