0

让我们考虑一个在 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 子句中的外连接

更新

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

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

有什么我错过的吗?

4

1 回答 1

0

在 EPL 中,我认为不可能将查询放入 from 部分。您可以使用“插入”进行更改。EPL 替代方案也是命名的窗口或表格。

于 2015-03-11T00:05:16.353 回答