复杂风控场景(反洗钱)下,一些sql解决方案

前言:

        在工作中遇到的一些比较复杂的场景,一直觉得很有记录的价值,但是就是嫌麻烦懒得写,拖延症比较厉害,主要是怕以后忘了,这些问题如果做面试题的话,也很考验人,算是给自己留个备忘录,也不知道还能干几年了,简单记录下。因为我们用的是hive和trino,但是不同公司使用的数据引擎可能不一样,sql语法会有些差别,所以这里就只写解决思路,不写具体sql。如果有缘人看到了问题后,有更好的解决思路可以留言讨论。

项目场景:

工作中遇到的一些复杂的风控场景,主要就是为了反洗钱,然后后续衍生出了很多类似的问题,但是稍微要求变化一些,做法就变了很多,挺有意思的。


问题描述:

为了防止洗钱,需要监控最近一小时内三次转入以上(三个不同的人)转出一次(定义为一次异常交易),连续两组异常交易的人,需要把这些转入转出人都查出来给系统告警,进入监控。


问题分析:

必须是三个人以上转入后由一次或者多次转出,只要是满足有一次转出就行,这算异常交易,主要是反洗钱。如果一次转入一次转出就不算,且需要有两次这种异常交易。


解决方案:

问题拆成两个问题来做,做两个字查询,然后join。

第一个子查询是要求查处连续超过三笔转入,一次转出,两次这种交易行为。

        根据交易金额增加一列交易类型标签,转入为0,转出为1,做开窗,按人做分组,按交易时间做排序,然后做行转列,每个人一行,把交易类型组成一个值,然后用like ‘%0001%0001%’,这样子可以把超过三次转入一次转出两组异常交易行为的人筛选出来。但是不能解决超过三个不同人的问题。

 第二个子查询是有连续超过三笔转入,切转入人是不同的三个人,因为是需要两次异常交易,所以需要给两次异常交易打上标签,不然无法区分是哪次的异常交易中的人。

        增加一列交易类型标签,转入为0,转出为1,做两个开窗row_number排序,第一个是按账户分组按交易时间排序,第二个是按账户和交易类型分组,按交易时间排序,效果大致如下:

账户交易类型交易人按账户分组按交易时间排序按账户和交易类型分组按交易时间排序两个排序值相减
a1b110
a0c211
a0d321
a0e431
a1f523

        这里一些字段没写,如交易时间,不是很重要。两个排序减完后,我们把转出类型的数据过滤掉,剩下的相同的就是一组交易的人,这时候我们再行转列,主键是账户,把交易人组成array然后去重,我们这时候用的是trino,语法有些不一样,用的array_agg,然后用了array_distinct去重,还有element_at(字段,3) is not null来判断是否大于等于三个人。

        最后两个子查询用账户号join,结果就是满足需求的数据,并且可以把每次出现风险预警的人都查出来。

2024/0619更新

问题描述:

要求查出来一段时间内一次以上转入,一次以上转出,发生这种异常交易三次的账户,且三个异常交易之间间隔不超过1小时。因为有洗钱的人是多个人往一张卡转,然后再往多张卡转出,所以要监控。


问题分析:

举个例子,如果转入为1转出为0,需要查出来在一段时间内交易类型是111100110010000的这种账户。如果只是用交易方式标签like %10%10%10的话,不能满足三组异常交易时间间隔一小时内的要求,所以还需要做其它加工判断。


解决方案:

对交易类型打标签,转入为1,转出为0,增加一列开窗函数lag,对lag(标签字段,1,标签字段)over(partition by 账号 order by 交易时间),往下挪一位,选择交易类型列小于开窗函数排序列的,然后再对交易时间做lead(交易时间,1,交易时间)over(partition 账号 order by 交易时间),两个交易时间做差值,然后筛选出来时间差值小于1小时的超过三个的,如下:

账号交易账号交易类型交易类型lag筛选交易类型小于lag列的交易时间交易时间lead时间差值
ab1110:01
ac1110:02
ad1110:03
af01保留10:0410:084
ag0010:05
aw0010:06
as1010:07
aq01保留10:0810:113
ad1010:09
af1110:10
af01保留10:1110:110
ag0010:12

问题描述:

要求查出一次转入三次以上转出这种异常交易连续发生三次的账号,且要求三次异常交易的人假期来超过12个不同,切每次异常交易超过4个不同的人。


问题分析:

举个例子,如果转入为1转出为0,需要查出来在一段时间内交易类型是100011100000111110的这种账户以及交易对手的账号,问题最大的是需要把一次转入和多次转出归位一个交易分组,需要每组交易之间人先去重,然后再把三组的人再去重计算人数大于12个。


解决方案:

还是给交易类型打标签转入为1,转出为0,这次要用上sum的开窗函数高阶用法,sum(交易类型标签)(partition  by 账号 order by 交易时间 row between unbunded preceding and current row),效果如下:

账号交易对手交易类型sum开窗函数的值
ab11
ac01
ad01
af01
ag12
ah13
ai03
aj03
ak03
。。。。。。。。。。。。

通过sum的开窗函数,我们把一次转入多次转出标记为一组交易,跟第一个问题类似,我们可以再行转列,再去重,去重后筛选出来大4个账号的,然后再把同一个账号的几组交易账号再合并去重,筛选出来人数大于12个的。这个问题最重要的是怎么把一次转入多次转出标记为一组交易。

问题描述:

来自上面问题的拓展,需要把多进多出标记为一组交易,任意次的转入和任意次的转出标记为一组。


问题分析:

该问题只是对需求的拓展,实际应用场景未知,不过想了很久问题比较复杂。需要实现的效果如下:

交易类型分组
11
11
11
11
01
12
12
02
02

解决方案:

先对交易类型打标签,转入为1,转出为0。然后对账号分组,对交易时间开窗排序,使用排序列和标签列相乘,然后把相乘的结果通过lag开窗函数往下挪一位。相乘的结果再减去lag的字段,的出结果后,我们在用max的开窗函数,求之前到当前行的最大值,比较抽象,效果如下:

交易时间排序交易类型交易时间排序和交易类型相乘laglag一位后相减max开窗求之前到当前的最大值
100000
200000
313033
414313
515413
6005-53
717077
8007-77
900007
1011001010
1111110110
120011-1110
13000010
14000010
15000010
1611601616
170016-1616
18000016
19000016
2012002020

通过这样子就可以把从转入开始到下一笔转入前的所有转入转出都标记为一组交易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几种常见的滤波器样式

IIR Peaking Filter IIR LowShelf Filter IIR HighShelf Filter 4. IIR LowPassFilter 5. IIR HighPass Filter FIR PeakingFilter FIR LowShelf Filter 8. FIR HighShelf Filter 8. FIR LowPass Filter 10. FIR HighPass Filter

命令行中,常见mysql命令

打开终端。 连接到 MySQL 服务器(假设你的mysql叫root): mysql -u root -p 输入密码: Enter password: ******** 查看所有数据库: mysql> SHOW DATABASES; ERROR 4031 (HY000): The client was disconnected …

操作系统入门 -- 进程的通信方式

操作系统入门 – 进程的通信方式 1.什么是进程通信 1.1 定义 进程通信就是在不同进程之间交换信息。在之前文章中可以了解到,进程之间相互独立,一般不可能互相访问。因此进程之间若需要通信,则需要一个所有进程都认可的共享空间&#xff0…

OpenHarmony-HDF驱动框架介绍及加载过程分析

前言 HarmonyOS面向万物互联时代,而万物互联涉及到了大量的硬件设备,这些硬件的离散度很高,它们的性能差异与配置差异都很大,所以这要求使用一个更灵活、功能更强大、能耗更低的驱动框架。OpenHarmony系统HDF驱动框架采用C语言面…

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据-08

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据 1. Kafka Broker 工作流程1.1 Zookeeper 存储的 Kafka 信息1.2 Kafka Broker总体工作流程1.2.1 Controller介绍 1.3 Broker 重要参数 2. 节点服役与退役3. Kafka副本 1. Kafka Broker 工作流程 …

GUI Guider(V1.7.2) 设计UI在嵌入式系统上的应用(N32G45XVL-STB)

目录 概述 1 使用GUI Guider 设计UI 1.1 创建页面 1.2 页面切换事件实现 1.3 生成代码和仿真 1.3.1 生成和编译代码 1.3.2 仿真UI 2 GUI Guider生成的代码结构 2.1 代码结构介绍 2.2 Project目录下的文件 3 板卡上移植UI 3.1 加载代码至工程目录 3.2 主函数中调…

【环境变量问题:计算机删除环境变量的恢复方法;此环境变量太大。此对话框允许将值设置为最长2047个字符】

不小心误删了win10系统环境变量可以试试下文方法恢复。 本方法针对修改环境变量未重启的用户可以使用,如果修改环境变量,然后还重启了,只能说重新来。 方法一:使用命令提示符恢复 被修改的系统Path只是同步到了注册表中&#x…

2024软考系规考前复习20问!看看你能答上来多少

今天给大家整理了——2024系统规划与管理师考前20问,这是一份很重要的软考备考必看干货,包含很多核心知识点。有PDF版,可打印下来,过完一遍教材后,来刷一刷、背一背,说不定可以帮你拿下不少分。 第1问- 信息…

python-录音文件转换成文字

大多数语音转文字工具都是要收费的,免费的很少,而且质量也不太高,python有自己的语音识别库,因此尝试使用一下。 先安装库: pip install pydub speechrecognition pip install pydub 安装 ffmpeg brew install ff…

2024.6.23周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、网络架构 四、创新点 五、文章解读 1、Introduction 2、Method 3、实验 4、结论 二、代码实验 总结 摘要 本周阅读了一篇题目为NAS-PINN: NEURAL ARCHITECTURE SEARCH-GUIDED PHYSICS-INFORMED NEURAL N…

解决电脑关机难题:电脑关不了机的原因以及方法

在使用电脑的日常生活中,有时会遇到一些烦人的问题,其中之一就是电脑关不了机。当您尝试关闭电脑时,它可能会停留在某个界面,或者根本不响应关机指令。这种情况不仅令人困惑,还可能导致数据丢失或系统损坏。 在本文中…

DS:堆的应用——两种算法和TOP-K问题

欢迎来到Harper.Lee的学习世界!博主主页传送门:Harper.Lee的博客主页想要一起进步的uu可以来后台找我哦! 一、堆的排序 1.1 向上调整——建小堆 1.1.1 代码实现 //时间复杂度:O(N*logN) //空间复杂度:O(logN) for (…

计算机网络知识点汇总

计算机网络知识点汇总 第1章计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 ​ 计算机网络是由若干个结点(node)和连接这些结点的链路(link)组成。网络中的结点可以是就三级、集线器、交换机、或者路由器等,网络之间通过路由器进行互联&#xf…

Nodejs 第七十九章(Kafka进阶)

kafka前置知识在上一章讲过了 不再复述 kafka进阶 1. server.properties配置文件 server.properties是Kafka服务器的配置文件,它用于配置Kafka服务的各个方面,包括网络设置、日志存储、消息保留策略、安全认证 #broker的全局唯一编号,不能…

MySQL数据库初体验+数据库管理(其一)

【1】 操作系统介绍: Linux操作系统有 RedHat CentOS Debian Ubuntu OpenSUSE 信创标准 国产系统 : 华为(欧拉) 阿里(龙蜥) 腾讯 (tencentOS) 麒麟&#xf…

【日记】梦到兄长要给鳄鱼换牙齿……(421 字)

正文 今天中午睡了一个小时多一点,做了一个很奇怪的梦。梦见兄长要给一条鳄鱼换牙齿,还说早上不好操作,要三天之后的中午或晚上,颇有一种翻黄历寻个良辰吉日之感。但我没那样大的耐性,便捏住鳄鱼的嘴,左摔右…

实战18:基于tkinter+jupyter notebook开发的情感分析系统

项目演示: 完整代码: import pandas as pd import numpy as np from collections import Counter import re import jieba from tqdm import tqdm from sklearn.metrics import roc_curve, auc import joblib import gensim from sklearn.svm import SVC from gensim.mode…

STM32小项目———感应垃圾桶

文章目录 前言一、超声波测距1.超声波简介2.超声波测距原理2.超声波测距步骤 二、舵机的控制三、硬件搭建及功能展示总结 前言 一个学习STM32的小白~ 有问题请评论区或私信指出 提示:以下是本篇文章正文内容,下面案例可供参考 一、超声波测距 1.超声波…

Studying-代码随想录训练营day16| 513找到左下角的值、112.路径总和、106从中序与后序遍历序列构造二叉树

第十六天,二叉树part03💪💪💪,编程语言:C 目录 513找到左下角的值 112.路径总和 113.路径总和II 106从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 总结 513找到左下角的值…

[240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞

目录 Anthropic 发布 Claude 3.5 Sonnet AI 助手Scoket.IO 拒绝服务漏洞(CVE-2024-38355) Anthropic 发布 Claude 3.5 Sonnet AI 助手 Claude 3.5 Sonnet: 更智能、更快速、更安全的 AI 助手 一、 引言 Anthropic 发布了 Claude 3.5 Sonnet&#xff0…