检查是否有连续三笔交易超过指定金额

时间:2018-12-26 11:19:32

标签: sql teradata

有一个表,其中包含有关银行中所有客户交易的数据。

万一卡被盗(例如借记卡),该不法之徒很可能会尽可能少地提取尽可能多的钱,以免被怀疑。因此,银行想知道是否连续三笔交易超过10000次,那么这就是欺诈。

每位客户一天可能有100笔交易,但每天只考虑每位客户连续三笔交易(任何三笔交易可能是1,2,3或7,8,9等)。

表中的数据如下:


cid trans_date  trans_time  amount
1   1/15/2018    9:21:33     4000
1   1/15/2018    9:21:34    12000
1   1/15/2018    9:35:33    11000
1   1/15/2018   10:21:33    10000
2   2/17/2018   11:21:33    10000
2   2/18/2018    9:21:33    10000
2   3/18/2018    9:21:33    10000
3   1/15/2018    9:23:33     4000
3   1/15/2018    9:24:33     9000
3   1/15/2018    9:25:33    10000
3   1/15/2018    9:26:33    14000
3   1/15/2018    9:27:33     4000
3   2/18/2018    9:21:33    10000
3   2/18/2018    9:22:33    13000
4   1/15/2018    9:21:33     4000
4   1/15/2018    9:22:33    10000
4   1/15/2018    9:23:33    12000
4   1/15/2018    9:24:33     4000
4   1/15/2018    9:25:33     2000
4   1/15/2018    9:26:33    60000
4   1/15/2018    9:27:33    10000

输出应为满足以下条件的cid:cid1。不应考虑cid 2,因为一天中只有两次连续的事务发生。当然3和4不满足条件。

我尝试了以下查询,但没有得到想要的结果。

select distinct bb.cid 
from
    (
        select
            cid,
            count(case when amount>=10000 then 1 else 0 end) 
                over(partition by cid,trans_date order by trans_time rows between current row and 2 following)
            cn
        from testtable ) bb 
where cn >= 3 

我正在使用Teradata v16数据库。

1 个答案:

答案 0 :(得分:2)

COUNT计算非NULL值,但是您的CASE始终返回一个值( 0/1 )。删除else 0或切换到SUM。此外,您可以使用QUALIFY摆脱衍生表

select distinct cid
from testtable
qualify 
   SUM(case when amount>=10000 then 1 else 0 end) 
   over(partition by cid, trans_date order by trans_time 
        rows 2 preceding) = 3