让我们考虑一个在具有属性(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
我错过了什么吗?
答案 0 :(得分:0)
在EPL中,我不认为可以对来自部分的查询进行查询。您可以使用"插入"进行更改。 EPL替代方案也是命名窗口或表。