Запрос Esper, когда в одном месте происходит несколько разных событий - PullRequest
0 голосов
/ 05 августа 2020

Предполагая следующий набор данных о местоположениях и активированных датчиках (и игнорируя время windows на данном этапе для простоты):

Location1       Sensor1
Location1       Sensor1

Location1       Sensor2

Location2       Sensor1
Location2       Sensor1

Я хочу создать запрос Esper, который возвращает факт для этого Location1 было активировано несколько датчиков (Sensor1 * Sensor 2).

Хотя Location2 имело несколько активаций, все они были от одного и того же датчика (Sensor1), поэтому это не должно срабатывать.

вкратце Я хочу сказать: «Сообщите мне, когда в одном месте срабатывает более одного датчика».

В чистом виде SQL я могу добиться этого с помощью следующего запроса:

SELECT location from
(SELECT DISTINCT location, sensor FROM sensorlog) a
GROUP BY location
HAVING count(location) > 1

I Я не могу перенести это прямо в Esper, хотя, похоже, ему не нравится подзапрос.

Может ли кто-нибудь подсказать, как я могу добиться этого в Esper?

Моя первая попытка была следующей: но похоже, что это срабатывает, даже если один датчик активируется в одном месте:

select location from SensorEntityWithAsset#time(30 sec) 
group by location, sensor 
having count(sensor) > 1 output every 30 seconds

Большое спасибо.

1 Ответ

0 голосов
/ 06 августа 2020

Разница между Esper и реляционными базами данных состоит в том, что Esper выводит результат, как только появляется третья строка «Location1 Sensor2». Он не допускает подзапросов в предложении from, поскольку предложения from являются потоками. Вместо этого подзапрос можно поместить в предложение where следующим образом (удалить теги% 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
)

Events ...

%esperscenario
Event={location='1', sensor='A'}
Event={location='1', sensor='A'}
Event={location='1', sensor='B'}

В случае, если идея также состоит в том, чтобы истекать события используйте вместо него Event#firstunique(location)#time(1 hour).

...