SODBASE CEP學習(十五):常見場景EPL示例
EX0001 統計10s的股票統計值,2s輸出一次。
解決方法:輸入定時觸發器timer週期設定為2s
CREATE QUERY demo
SELECT T1._start_time_ AS starttime,average(T2.price) ASavg,T3._end_time_ AS endtime
FROM T1:timer,T2:模擬股票,T3:timer
PATTERN T1;T2^+;T3
WHERE T1._start_time_=T3._start_time_-10000
WITHIN 10000
EX0002統計每一隻股票的10s的統計值,2s輸出一次
解決方法:輸入timer週期設定為2s
CREATE QUERY demo
SELECT T1,T2,T3
FROM T1:timer,T2:模擬股票,T3:timer
PATTERN T1;T2^+;T3
Group BY T2.name
WHERE T1._start_time_=T3._start_time_-10000
WITHIN 10000
EX0003每當股價超過閾值後,開啟10秒視窗,統計10秒內股價超過閾值的事件(>80.0)。這10秒內的超過閾值事件,就不再開啟新的10秒視窗。
CREATE QUERY delayoutput2
SELECT T1,T2,T3
FROM T1:stokIn,T2:stockIn,T3:delay10sec
PATTERN T1;T2^+;T3
WHERE T1._start_time_=T3._start_time_-10000
AND T1.price>80.0
AND T2.price>80.0
WITHIN 10000 BATCHMODE
EX0004查詢10分鐘以內,單筆金額小於等於10元,大於等於2筆的交易卡號和金額
(1) SODSQL
select T1.cardid AS T1_cardid,T1.value AS T1_value,tostring(T2.value)AS T2_value,T3.value AS T3_value
from T1:Event,T2:Event,T3:Event
PATTERN T1;T2^*;T3
GROUP By T1.cardid
WHERE T1.value<=10 AND T3.value<=10 ANDT1.cardid=T3.cardid AND T1.cardid=T2.cardid AND T2.value<=10
WITHIN 36000000
(2)參考Esper
select cardid
from Event.win:time(10 min)
where value<=10
group by cardid
having count(*)>=2
P00003檢測短時間內,同一賬號連續發生接近授權金額的交易
SODSQL語句:
CREATE QUERY P00003
SELECT T1,T2,T3
FROM T1: 模擬銀行交易資料,T2:模擬銀行交易資料,T3:模擬銀行交易資料PATTERN T1;T2^*;T3
WHERE T2.amt<50000 AND T2.amt>45000
AND T3.amt<50000 AND T3.amt>45000
AND T1.amt<50000 AND T1.amt>45000
AND T1.Account=T2.Account
AND T2.Account=T3.Account
WITHIN 11000
P00004:同一個賬戶連續進行的大額轉賬相反交易
SODSQL語句:
CREATE QUERY P00004
SELECT T1,T2 FROM T1:模擬銀行交易資料,T2:非法交易2
PATTERN T1;T2
WHERE T1.Account = T2.Account
AND T1.trans_flag='in'
AND T2.trans_flag='out'
WITHIN 500
P00023:檢測短時間內櫃面現金交易,防止將使用者的“先取後存”業務辦理為“先存後取”
SODSQL語句:
CREATE QUERY P00023
SELECT T1,T2 FROM T1:模擬銀行交易資料,T2:非法交易2
PATTERN T1;T2
WHERE T1.Account = T2.Account
AND T2.dc_flag='C'
AND T1.dc_flag = 'A'
AND T1.cash_trans_flag= '1'
AND T2.cash_trans_flag = '1'
WITHIN 1000
P00101監測是否存在當日現金出現大收大付
SODSQL語句:
CREATE QUERY P00101
SELECT T1,T2
FROM T1:模擬銀行交易資料,T2:模擬銀行交易資料
PATTERN T1&T2
WHERE T1Account=T2.Account
WITHIN 86400000
OLP0001檢測"使用者確認支付"後,沒有"銀行轉賬成功",就"出貨"
SODSQL語句:
CREATE QUERY OLP0001
SELECT T1,T2,T3
FROM T1:線上支付模擬資料,T2:線上支付模擬資料,T3:線上支付模擬資料 PATTERN T1;!T2;T3
WHERE T1.userid=T3.userid
AND T2.userid=T3.userid
AND T1.message='verifypay'
AND T2.message='bankpaycomplete'
AND T3.message ='productrelease'
AND T1.productid=T3.productid
AND T2.productid=T3.productid
WITHIN 20000
OLP0002"使用者確認支付"後,"銀行轉賬成功",3秒內沒有"出貨"
SODSQL語句:
CREATE QUERY OLP002
SELECT T1,T2,T3,T4
FROM T1:onlinepayment,T2:onlinepayment,T3:onlinepayment,T4:timer PATTERNT1;(T2;!T3;T4)
WHERE T2.userid=T3.userid
AND T2.userid=T1.userid
AND T1.message='verifypay'
AND T2.message='bankpaycomplete'
AND T3.message ='productrelease'
AND T3.productid=T1.productid
AND T3.productid=T2.productid
AND T4._start_time_-T2._start_time_> 1000 WITHIN 2000
EX0005查詢30s內輸入不同密碼的次數大於5的使用者
解決方法:輸入定時觸發器timer週期設定為30s
CREATE QUERY demo
SELECT T1._start_time_ AS starttime,average(T2.price) ASavg,T3._end_time_ AS endtime
FROM T1: 登入,T2:登入,T3: 登入
PATTERN T1;T2^+;T3
GROUP BY T2.name
WHERE countdistinct(T2.password)>3
AND T1.name=T2.name AND T3.name=T1.name
WITHIN 30000
EX0006 當reader 讀到標籤後,在1s內該標籤還在則認為是連續讀到該標籤,2s後該標籤還存在,則出發進入通道事件,進入通道後,如果2s內reader 未讀到標籤則觸發離開事件
“讀到標籤ReadSuccessiveEvent”
CREATE QUERY readsuccessive
SELECT 'readsuccessive' AS type, T1.id AS T1_id,T1.num AS T1_num,T2.id AST2_id,T2.num AS T2_num
FROM T1:readerevent,T2:readerevent
PATTERN T1;T2
WHERE T1.id=T2.id
WITHIN 1000
"進入通道"readenterchannel
CREATE QUERY readenterchannel
SELECT 'enterchannel' AS type,T3.id AS T3_id,T3.num AS num FROMT1:readerevent,T2:readerevent,T3:readerevent
PATTERN T1;T2;T3
WHERE T1.id=T2.id
AND T1.id=T3.id
AND T2._end_time_-T1._end_time_<=1000
AND T3._end_time_-T2._end_time_<2000
AND T3._end_time_-T1._end_time_>1000
WITHIN 3000
"離開事件" readoutofchannel
CREATE QUERY readoutofchannel2
SELECT T1.id AS T1_id,T1.num AS T1_num,'outofchannel' AS type
FROM T1:readerevent,T2:readerevent,T3:delay2sectimer
PATTERN T1;!T2;T3
WHERE T1.id=T2.id AND T3._end_time_-T1._end_time_=2000
WITHIN 2000
EX0007 查詢哪個卡號1小時內的總交易金額大於1w
CREATE QUERY pos
SELECT T1.acctnum AS acctum,T1.value AST1_value,tostring(T2.value) AS T2.value,T3.value AS T3_value
FROM T1: pos,T2:pos,T3:pos
PATTERN T1;T2^+;T3
GROUP BY T2.acctnum
WHERE T1. acctnum =T2. acctnum
AND T3. acctnum =T1. acctnum
AND T1.value+T2.value+sum(T3.value)>10000
WITHIN 10000