Esper - объединить значения из нескольких строк в список
У меня есть запрос Esper, который возвращает несколько строк, но я бы хотел вместо этого получить одну строку, где эта строка имеет список (или объединенную строку) всех значений из (соответствующих столбцов) совпадающих строк, которые мой текущий запрос возвращается.
Например:
SELECT Name, avg(latency) as avgLatency
FROM MyStream.win:time(5 min)
GROUP BY Name
HAVING avgLatency / 1000 > 60
OUTPUT last every 5 min
Возвращает:
Name avgLatency
---- ----------
A 65
B 70
C 75
Что бы я действительно хотел:
Name
----
{A, B, C}
Можно ли это сделать через сам запрос? Я пытался сделать это с помощью подзапросов, но я не работаю с несколькими потоками. Я не могу найти никаких функций агрегирования или перечисления в документации Esper, которые бы соответствовали тому, что я пытаюсь сделать.
Спасибо всем, у кого есть понимание или направление для меня здесь.
РЕДАКТИРОВАТЬ: Если это не может быть сделано с помощью запроса, я открыт для изменения подписчика, или что-нибудь еще, если это необходимо.
1 ответ
Вы можете попросить абонента или слушателя сделать конкат. Для абонентов предусмотрена "Многорядная доставка". Или используйте таблицу, как показано ниже.
// create table to hold aggregation result
create table LatencyTable(name string primary key, avgLatency avg(double));
// update aggregations in table from events coming in
into LatencyTable select name, avg(latency) as avgLatency from MyStream#time(5 min) group by name;
// do a select with the "aggregate" enumeration method
select (select * from LatencyTable where avgLatency > x).aggregate(....) from pattern[every timer:interval(5 min)]