Esper 查询何时在一个位置发生多个不同的事件
Esper query for when multiple different events occur in one location
假设以下数据集,包含已激活的位置和传感器(为简单起见,此时忽略时间 windows):
Location1 Sensor1
Location1 Sensor1
Location1 Sensor2
Location2 Sensor1
Location2 Sensor1
我想创建一个 Esper 查询,returns Location1 已激活多个传感器(传感器 1 * 传感器 2)。
虽然 Location2 有多次激活,但它们都来自同一个传感器 (Sensor1),因此不应触发。
简而言之,我想说“告诉我何时在一个位置激活了多个传感器”。
在纯粹的 SQL 术语中,我可以通过以下查询实现此目的:
SELECT location from
(SELECT DISTINCT location, sensor FROM sensorlog) a
GROUP BY location
HAVING count(location) > 1
我无法将其直接转换为 Esper,因为它似乎不喜欢子查询。
任何人都可以建议我如何在 Esper 中实现这一点吗?
我最初的尝试如下,但即使单个传感器在单个位置激活,这似乎也会触发:
select location from SensorEntityWithAsset#time(30 sec)
group by location, sensor
having count(sensor) > 1 output every 30 seconds
非常感谢。
Esper和关系型数据库的区别在于,Esper在第三行“Location1 Sensor2”一出现就输出结果。它不允许 from-clause 中的子查询,因为 from-clause 是流。子查询可以改为像这样放入 where-clause(删除 % notebook 标签)
%esperepl
create schema Event(location string, sensor string);
select * from Event as incoming
where exists (
select * from Event#firstunique(location) as existingEvents
where existingEvents.sensor != incoming.sensor
)
活动...
%esperscenario
Event={location='1', sensor='A'}
Event={location='1', sensor='A'}
Event={location='1', sensor='B'}
如果这个想法也是过期事件,请改用 Event#firstunique(location)#time(1 hour)
。
假设以下数据集,包含已激活的位置和传感器(为简单起见,此时忽略时间 windows):
Location1 Sensor1
Location1 Sensor1
Location1 Sensor2
Location2 Sensor1
Location2 Sensor1
我想创建一个 Esper 查询,returns Location1 已激活多个传感器(传感器 1 * 传感器 2)。
虽然 Location2 有多次激活,但它们都来自同一个传感器 (Sensor1),因此不应触发。
简而言之,我想说“告诉我何时在一个位置激活了多个传感器”。
在纯粹的 SQL 术语中,我可以通过以下查询实现此目的:
SELECT location from
(SELECT DISTINCT location, sensor FROM sensorlog) a
GROUP BY location
HAVING count(location) > 1
我无法将其直接转换为 Esper,因为它似乎不喜欢子查询。
任何人都可以建议我如何在 Esper 中实现这一点吗?
我最初的尝试如下,但即使单个传感器在单个位置激活,这似乎也会触发:
select location from SensorEntityWithAsset#time(30 sec)
group by location, sensor
having count(sensor) > 1 output every 30 seconds
非常感谢。
Esper和关系型数据库的区别在于,Esper在第三行“Location1 Sensor2”一出现就输出结果。它不允许 from-clause 中的子查询,因为 from-clause 是流。子查询可以改为像这样放入 where-clause(删除 % notebook 标签)
%esperepl
create schema Event(location string, sensor string);
select * from Event as incoming
where exists (
select * from Event#firstunique(location) as existingEvents
where existingEvents.sensor != incoming.sensor
)
活动...
%esperscenario
Event={location='1', sensor='A'}
Event={location='1', sensor='A'}
Event={location='1', sensor='B'}
如果这个想法也是过期事件,请改用 Event#firstunique(location)#time(1 hour)
。