将SQL JOIN SELECT转换为Esper EPL语法

时间:2015-03-10 19:41:27

标签: esper epl nesper

让我们考虑一个在具有属性(columns)的SQL数据库中具有相同表示的简单对象:Id,UserId,Ip。

我想准备一个查询,以便在一个用户在1小时内从2个IP地址(或更多)登录时生成事件。

我的SQL看起来像:

SELECT id,user_id,ip FROM w_log log
LEFT JOIN
(SELECT user_id, count(distinct ip) AS ip_count FROM w_log GROUP BY user_id) ips 
ON log.user_id = ips.user_id
WHERE ips.ip_count > 1

转换为EPL:

SELECT * FROM LogEntry.win:time(1 hour) logs LEFT INNER join 
(select UserId,count(distinct Ip) as IpCount FROM LogEntry.win:time(1 hour)) ips 
ON logs.UserId = ips.UserId where ips.IpCount>1

例外:

其他信息:'('第1行第100列附近的语法不正确, 请检查保留关键字'select'

附近的from子句中的外连接

更新

我成功地创建了一个模式,命名窗口并将数据插入其中(或更新它)。我想在新的LogEvent到达.win:time(10秒)时增加计数器,并在事件离开10秒窗口时减少它。不幸的是,当事件在删除流中时,istream()似乎不提供true / false。

create schema IpCountRec as (ip string, hitCount int)

create window IpCountWindow.win:time(10 seconds) as IpCountRec

on LogEvent.win:time(10 seconds) log 
merge IpCountWindow ipc
where ipc.ip = log.ip
when matched and istream()
  then update set hitCount = hitCount + 1 
when matched and not istream()
  then update set hitCount = hitCount - 1
when not matched
  then insert select ip, 1 as hitCount

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

在EPL中,我不认为可以对来自部分的查询进行查询。您可以使用"插入"进行更改。 EPL替代方案也是命名窗口或表。