获取每个账户最大连续逾期期数
工具:Oracle lag()与lead()函数
lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。
over()表示 lag()与lead()操作的数据都在over()的范围内,里面可以使用partition by 语句(用于分组) order by 语句(用于排序)。
partition by a order by b表示以a字段进行分组,再以b字段进行排序,对数据进行查询。
例如:lead(field, num, defaultvalue) field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值。
示例:
账号 |
逾期日期 |
逾期标志 |
acc01 |
20180101 |
Y |
acc01 |
20180201 |
Y |
acc01 |
20180301 |
Y |
acc01 |
20180401 |
Y |
acc01 |
20180501 |
N |
acc01 |
20180601 |
N |
acc01 |
20180701 |
Y |
acc01 |
20180801 |
Y |
acc01 |
20180901 |
N |
acc01 |
20181001 |
Y |
acc01 |
20181101 |
N |
acc01 |
20181201 |
N |
acc02 |
20180115 |
Y |
acc02 |
20180215 |
N |
acc02 |
20180315 |
Y |
acc02 |
20180415 |
Y |
acc02 |
20180515 |
N |
acc02 |
20180615 |
Y |
acc02 |
20180715 |
Y |
acc02 |
20180815 |
N |
acc02 |
20180915 |
N |
acc02 |
20181015 |
Y |
acc02 |
20181115 |
Y |
acc02 |
20181215 |
Y |
处理逻辑
1.
用leg()获取对应上一条数据,使用"ROW_FIRST"标记首位行
用lead()获取对应上一条数据,使用"ROW_LAST"标记尾行
2.
当本期为首行时,如果本期逾期标志=Y,连续逾期标志=START_OVER,否则不标记
当本期为尾行时,如果本期逾期标志=Y,上期逾期标志=Y,连续逾期标志=END_OVER
上期逾期标志=N,连续逾期标志=ONE_OVER
如果本期逾期标志=N,连续逾期标志=不标记
当本期为首行,同时也是尾行时,连续逾期标志=ONE_OVER
当本期为中间行时,如果本期逾期标志=Y,上期逾期标志=N,连续逾期标志=START_OVER
如果本期逾期标志=N,上期逾期标志=Y,连续逾期标志=END_OVER
3.
筛选掉连续逾期标志=NO_FALG的数据,用leg()按日期排序,将逾期开始日期和逾期结束日期拼接到同一行。
4.
当连续逾期标志=ONE_FLAG时,逾期期数=1
当连续逾期标志=END_FLAG时,逾期期数=逾期开始日期-逾期结束日期
账号 |
逾期日期 |
逾期标志 |
上期逾期日期 |
上期逾期标志 |
本期+上期 |
连续逾期标志 |
acc01 |
20180101 |
Y |
|
|
Y- |
START_OVER |
acc01 |
20180201 |
Y |
20180101 |
Y |
Y-Y |
|
acc01 |
20180301 |
Y |
20180201 |
Y |
Y-Y |
|
acc01 |
20180401 |
Y |
20180301 |
Y |
Y-Y |
|
acc01 |
20180501 |
N |
20180401 |
Y |
N-Y |
END_OVER |
acc01 |
20180601 |
N |
20180501 |
N |
N-N |
|
acc01 |
20180701 |
Y |
20180601 |
N |
Y-N |
START_OVER |
acc01 |
20180801 |
Y |
20180701 |
Y |
Y-Y |
|
acc01 |
20180901 |
N |
20180801 |
Y |
N-Y |
END_OVER |
acc01 |
20181001 |
Y |
20180901 |
N |
Y-N |
START_OVER |
acc01 |
20181101 |
N |
20181001 |
Y |
N-Y |
END_OVER |
acc01 |
20181201 |
N |
20181101 |
N |
N-N |
|
|
|
|
|
N |
-N |
|
acc02 |
20180115 |
N |
|
|
N- |
|
acc02 |
20180215 |
N |
20180115 |
Y |
N-Y |
END_OVER |
acc02 |
20180315 |
Y |
20180215 |
N |
Y-N |
START_OVER |
acc02 |
20180415 |
Y |
20180315 |
Y |
Y-Y |
|
acc02 |
20180515 |
N |
20180415 |
Y |
N-Y |
END_OVER |
acc02 |
20180615 |
Y |
20180515 |
N |
Y-N |
START_OVER |
acc02 |
20180715 |
Y |
20180615 |
Y |
Y-Y |
|
acc02 |
20180815 |
N |
20180715 |
Y |
N-Y |
END_OVER |
acc02 |
20180915 |
N |
20180815 |
N |
N-N |
|
acc02 |
20181015 |
Y |
20180915 |
N |
Y-N |
START_OVER |
acc02 |
20181115 |
Y |
20181015 |
Y |
Y-Y |
|
acc02 |
20181215 |
Y |
20181115 |
Y |
Y-Y |
|
|
|
|
|
Y |
-Y |
|
脚本
SELECT
ACC_NO,
OVER_DT_F,
OVER_DT,
CASE WHEN SERIAL_OVER_FLAG='ONE_OVER' THEN 1
WHEN SERIAL_OVER_FLAG='END_OVER' THEN OVER_DT-OVER_DT_F
ELSE 'ERROR'
END
FROM (
SELECT
ACC_NO,
OVER_DT,
SERIAL_OVER_FLAG,
LAG(OVER_DT,1,OVER_DT)OVER(PARTITION BY ACC_NO ORDER BY OVER_DT) AS OVER_DT_F
FROM (
SELECT
ACC_NO,
OVER_DT,
CASE WHEN OVER_FLAG_F='ROW_FIRST' AND OVER_FLAG='Y' THEN 'START_OVER'
WHEN OVER_FLAG_F='ROW_FIRST' AND OVER_FLAG_B='ROW_LAST' THEN 'ONE_OVER'
WHEN OVER_FLAG_B='ROW_LAST' AND OVER_FALG='Y' AND OVER_FLAG_F='Y' THEN 'END_OVER'
WHEN OVER_FLAG_B='ROW_LAST' AND OVER_FALG='Y' AND OVER_FLAG_F='N' THEN 'ONE_OVER'
WHEN OVER_FALG='Y' AND OVER_FLAG_F='N' THEN 'STAR_OVER'
WHEN OVER_FLAG='N' AND OVER_FALG_F='Y' THEN 'END_OVER'
ELSE 'NO_FALG'
END AS SERIAL_OVER_FLAG
FROM (
SELECT
ACC_NO,
OVER_DT,
OVER_FLAG,
LAG(OVER_FLAG,1,'ROW_FIRST')OVER(PARTITION BY ACC_NO ORDER BY OVER_DT) AS OVER_FLAG_F, --用leg()获取对应上一条数据,使用"ROW_FIRST"标记首位行
LEAD(OVER_FLAG,1,'ROW_LAST')OVER(PARTITION BY ACC_NO ORDER BY OVER_DT) AS OVER_FLAG_B --用lead()获取对应上一条数据,使用"ROW_LAST"标记尾行
FROM ACC_TAB
)
)
WHERE SERIAL_OVER_FALG<>'NO_FALG'
) WHERE SERIAL_OVER_FLAG<>'START_OVER'
;
获取每个账户最大连续逾期期数相关推荐
- 风控基础——通俗介绍逾期次数和逾期期数
假设某人在2017年1月申请了一笔住房贷款,按合同每个月需要还款2000元,但是因暂时的资金周转不灵,3月至7月连续5个月都没有还款.那么他7 月的当前逾期期数.累计逾期次数和最高逾期期数则分别是: ...
- 如何理解“当前逾期期数”、“累计逾期次数”与“最高逾期期数”?
如何理解"当前逾期期数"."累计逾期次数"与"最高逾期期数"? 这三个项目很容易混淆,我们可以举个例子来说明一下:假设2006年1月某客户申 ...
- Python获取一个字符串所有连续子串
获取一个字符串所有连续子串组成集合(set)的长度,居然是Facebook的interview题目,我也做出来了,哈哈: def get_all_substrings(string):length = ...
- libvirt:获取 guest 账户的IP地址
文章目录 libvirt 获取 guest账户的IP方案 方案 方案一:virsh 命令 方案二:调用API接口 相关错误解决方法: 思考 libvirt 获取 guest账户的IP方案 方案 目前找 ...
- SAP 银企直联 批量获取银行账户数据
事务代码:EPIC_IMP_S 批量获取银行账户数据 短文本 批量获取银行账户数据 目的 此程序用于在后台直接从银行自动下载和导入银行账户余额以及银行回单数据. 如果要手动导入数据,则可使用 导入银行 ...
- JAVA通过auth_code获取支付宝账户信息
业务中用到了绑定支付宝账户的功能,需要移动端唤起支付宝app获取到auth_code后传递给后台,后台将用户支付宝的头像,昵称,user_id存入数据库,以便后面做退款转账业务. 首先需要在支付宝平台 ...
- php反射型xss,利用反射型XSS漏洞,模拟获取登录账户的Cookie
目录结构 一.测试环境 二.测试目标 三.原理描述 四.操作步骤 1.在服务器上搭建并启用hacker测试网站 2.在服务器上测试站点根目录内创建一个存放攻击脚本的文件夹 3.在xss文件夹下创建攻击 ...
- xpath获取指定的非连续索引的子元素的文本数据
示例: <table> <thead> <tr> <th>ID</th> <th>名称</th> <th> ...
- 四扫客户接口——接口测试完成文档
文章目录 CREATE TABLE 1创建custom表 6新建活动表_ACTIVITY 7创建teller表 8.建立模板表 9.增加个性化模板表 10.建立客户与活动对应表 11.创建流水表 16 ...
最新文章
- C++中vector的使用
- perl 对ENV环境变量的使用
- [译] Fiber内幕:深入概述React新的协调算法
- 最新综述:基于Transformer的NLP预训练模型已经发展到何种程度?
- java排序算法之冒泡排序
- 循环链表实现两个多项式相加主要代码
- 分布式面试 - dubbo 的 spi 思想是什么?
- Mysql学习总结(27)——Mysql数据库字符串函数
- Lucene全文检索_分词_复杂搜索_中文分词器
- centos配置虚拟主机
- POI(兴趣点)抓取工具
- 企业微信开发整理汇总
- 专升本英语固定词组搭配500个
- AR室内导航-Three.js
- (解决)Circular view path [index]: would dispatch back to the current handler URL [] again. Che
- petalinux-build 报错解决
- Windows远程桌面实现之六(新版本框架更新,以及网页HTML5音频采集通讯)
- 5个人站队,每个人不在原位置有多少种站法
- 广告营销DSP和DMP概念解释
- 从零构建区块链量化交易平台课程总结-思维模型和方法论提炼