工具: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'

;

获取每个账户最大连续逾期期数相关推荐

  1. 风控基础——通俗介绍逾期次数和逾期期数

    假设某人在2017年1月申请了一笔住房贷款,按合同每个月需要还款2000元,但是因暂时的资金周转不灵,3月至7月连续5个月都没有还款.那么他7 月的当前逾期期数.累计逾期次数和最高逾期期数则分别是: ...

  2. 如何理解“当前逾期期数”、“累计逾期次数”与“最高逾期期数”?

    如何理解"当前逾期期数"."累计逾期次数"与"最高逾期期数"? 这三个项目很容易混淆,我们可以举个例子来说明一下:假设2006年1月某客户申 ...

  3. Python获取一个字符串所有连续子串

    获取一个字符串所有连续子串组成集合(set)的长度,居然是Facebook的interview题目,我也做出来了,哈哈: def get_all_substrings(string):length = ...

  4. libvirt:获取 guest 账户的IP地址

    文章目录 libvirt 获取 guest账户的IP方案 方案 方案一:virsh 命令 方案二:调用API接口 相关错误解决方法: 思考 libvirt 获取 guest账户的IP方案 方案 目前找 ...

  5. SAP 银企直联 批量获取银行账户数据

    事务代码:EPIC_IMP_S 批量获取银行账户数据 短文本 批量获取银行账户数据 目的 此程序用于在后台直接从银行自动下载和导入银行账户余额以及银行回单数据. 如果要手动导入数据,则可使用 导入银行 ...

  6. JAVA通过auth_code获取支付宝账户信息

    业务中用到了绑定支付宝账户的功能,需要移动端唤起支付宝app获取到auth_code后传递给后台,后台将用户支付宝的头像,昵称,user_id存入数据库,以便后面做退款转账业务. 首先需要在支付宝平台 ...

  7. php反射型xss,利用反射型XSS漏洞,模拟获取登录账户的Cookie

    目录结构 一.测试环境 二.测试目标 三.原理描述 四.操作步骤 1.在服务器上搭建并启用hacker测试网站 2.在服务器上测试站点根目录内创建一个存放攻击脚本的文件夹 3.在xss文件夹下创建攻击 ...

  8. xpath获取指定的非连续索引的子元素的文本数据

    示例: <table> <thead> <tr> <th>ID</th> <th>名称</th> <th> ...

  9. 四扫客户接口——接口测试完成文档

    文章目录 CREATE TABLE 1创建custom表 6新建活动表_ACTIVITY 7创建teller表 8.建立模板表 9.增加个性化模板表 10.建立客户与活动对应表 11.创建流水表 16 ...

最新文章

  1. C++中vector的使用
  2. perl 对ENV环境变量的使用
  3. [译] Fiber内幕:深入概述React新的协调算法
  4. 最新综述:基于Transformer的NLP预训练模型已经发展到何种程度?
  5. java排序算法之冒泡排序
  6. 循环链表实现两个多项式相加主要代码
  7. 分布式面试 - dubbo 的 spi 思想是什么?
  8. Mysql学习总结(27)——Mysql数据库字符串函数
  9. Lucene全文检索_分词_复杂搜索_中文分词器
  10. centos配置虚拟主机
  11. POI(兴趣点)抓取工具
  12. 企业微信开发整理汇总
  13. 专升本英语固定词组搭配500个
  14. AR室内导航-Three.js
  15. (解决)Circular view path [index]: would dispatch back to the current handler URL [] again. Che
  16. petalinux-build 报错解决
  17. Windows远程桌面实现之六(新版本框架更新,以及网页HTML5音频采集通讯)
  18. 5个人站队,每个人不在原位置有多少种站法
  19. 广告营销DSP和DMP概念解释
  20. 从零构建区块链量化交易平台课程总结-思维模型和方法论提炼

热门文章

  1. 分布式事务中的那些事——微服务总结(二)
  2. BCG 动态链接库和静态链接库
  3. Alexa网站排名爬取
  4. mediasoup 学习笔记 【二】Router 房间
  5. Qt Qml 查看所有字体、添加字体库、使用字体库的方法
  6. PVP:手游进程的终点
  7. linux究竟有何优势?为何大多数程序员会选择linux?
  8. 字节跳动薪资_字节跳动入局社区团购,以高出市场两倍薪资挖人
  9. 第13周项目4 立体类族公有的抽象类
  10. 合作共赢!荷兰Swissflow成功入驻ISweek工采网!