前言:
在工作中遇到的一些比较复杂的场景,一直觉得很有记录的价值,但是就是嫌麻烦懒得写,拖延症比较厉害,主要是怕以后忘了,这些问题如果做面试题的话,也很考验人,算是给自己留个备忘录,也不知道还能干几年了,简单记录下。因为我们用的是hive和trino,但是不同公司使用的数据引擎可能不一样,sql语法会有些差别,所以这里就只写解决思路,不写具体sql。如果有缘人看到了问题后,有更好的解决思路可以留言讨论。
项目场景:
工作中遇到的一些复杂的风控场景,主要就是为了反洗钱,然后后续衍生出了很多类似的问题,但是稍微要求变化一些,做法就变了很多,挺有意思的。
问题描述:
为了防止洗钱,需要监控最近一小时内三次转入以上(三个不同的人)转出一次(定义为一次异常交易),连续两组异常交易的人,需要把这些转入转出人都查出来给系统告警,进入监控。
问题分析:
必须是三个人以上转入后由一次或者多次转出,只要是满足有一次转出就行,这算异常交易,主要是反洗钱。如果一次转入一次转出就不算,且需要有两次这种异常交易。
解决方案:
问题拆成两个问题来做,做两个字查询,然后join。
第一个子查询是要求查处连续超过三笔转入,一次转出,两次这种交易行为。
根据交易金额增加一列交易类型标签,转入为0,转出为1,做开窗,按人做分组,按交易时间做排序,然后做行转列,每个人一行,把交易类型组成一个值,然后用like ‘%0001%0001%’,这样子可以把超过三次转入一次转出两组异常交易行为的人筛选出来。但是不能解决超过三个不同人的问题。
第二个子查询是有连续超过三笔转入,切转入人是不同的三个人,因为是需要两次异常交易,所以需要给两次异常交易打上标签,不然无法区分是哪次的异常交易中的人。
增加一列交易类型标签,转入为0,转出为1,做两个开窗row_number排序,第一个是按账户分组按交易时间排序,第二个是按账户和交易类型分组,按交易时间排序,效果大致如下:
账户 | 交易类型 | 交易人 | 按账户分组按交易时间排序 | 按账户和交易类型分组按交易时间排序 | <