最近遇到这样一个事:许多DBA的小伙伴不太明白金融业务中复借用户的定义方式以及sql查询方式,给他们提需求也整不明白,需求如下:

  根据订单编号,查询用户该订单所对应的复借次数(白话讲就是:我有一笔订单,想看看这笔订单是用户在本平台的第几笔订单)

  既然他们整不明白,那就自己写吧。

  下面简单介绍下“复借”,再列举几种在mysql、oracle数据库中统计用户复借次数的方式。sql能力就是一点点提升的,希望能够抛砖引玉,窥一斑而知全豹。


一、如何定义复借

  复借是指在一个贷款平台借款订单还清后继续申请贷款的行为

  复借次数即为该用户累计成功借还款的总次数

  在数据库中,统计复借这个指标,用到的基本为还款表:即每个用户(user_id)的每一笔订单(apply_id)对应的还款情况(是否到期,是否成功还款)。

  基本思路:成功还款1次,复贷次数+1

  另外,考虑产品记期方式不同,我们分单期和多期两种产品来讨论

二、单期产品

方法1:Mysql之子查询计数

  简单的说,就是两张相同的表做左外联,统计user_id相同时,第一张表apply_id比第二张表apply_id大的数据

  内联子查询:生成两张相同的表,然后做左外联,这样表2中与表1user_id相同的数据就都会被查询得到,结果如下:

  再用where做一层判断,把表1比表2apply_id大的数据筛选出来。效果如下:

  对应的sql大致如下:

select * from(SELECT * FROM repayment ) a
left join (SELECT * FROM repayment ) b
on a.user_id = b.user_id and a.apply_id > b.apply_id

  接下来分组统计apply_id计数,即可求得复借次数,下面为实操sql:

select a.user_id,a.apply_id,count(b.apply_id) loan_nfrom (SELECT r.user_id,r.apply_idFROM`repayment` r LEFT JOIN app_user u ON r.user_id = u.id WHERE `repay_status` = '已还' ) a
left join (SELECT r.user_id,r.apply_idFROM`repayment` r LEFT JOIN app_user u ON r.user_id = u.id WHERE `repay_status` = '已还' ) b
on a.user_id = b.user_id and a.apply_id > b.apply_id
group by a.user_id,a.apply_id
ORDER BY a.user_id,loan_n

  结果如下:

方法2:Oracle之分析函数

  Oracle较mysq而言,增加了许多高级函数,常用的分析函数如下:

  OVER(PARTITION BY… ORDER BY…)的使用说明和意义:

  顾名思义,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻译一下就是先把一组数据按照指定的字段进行分割成各种组,然后组内按照某个字段排序。

  那我们大致的思路,就是先按照user_id对用户订单进行分组,再按照apply_id的大小进行一个正序排序,就是这么简单。

select user_id,apply_id,row_number() over(partition by user_id  order by apply_id)-1 loan_n
from repayment

  和mysql处理后的效果一样

方法3:Mysql 自定义变量 实现高级分析函数的功能

  Mysql暂不支持lag()、lead()等统计函数,我们用自定义变量的方法来实现这个功能。

  大致思路为: 固定列A(user_id列),定义两个自变量B(@user_id)、C(@rank),sql执行过程中动态比较A与B(注意细节,实际比的是A(n)与B(n-1)),如果一致,变量C(n)计数+1;如果不一致,变量C(n)重置为0。

  也就是,sql按行执行的过程中,累计统计user_id为相同值的数量(一般实现排序功能,都这么用)

  如下图,第一行user_id为4,@user_id(自定义变量)为空,rank就为0;第二行user_id为4,@user_id已更新为4,两数对比相同,rank就+1为1;第三行user_id为4,@user_id更新为4,两数对比相同,rank就+1为2;第四行user_id为21,@user_id更新为4,两数对比不同,rank重置为0。以此类推

  sql实现步骤如下:

select
b.user_id,
b.apply_id,
if(@user_id = b.user_id, @rank := @rank , @rank := 0) as loan_n,@user_id:=b.user_id
from
(SELECT r.user_id,r.apply_id,@user_id := null, @rank := 0#count(apply_id) loan_nFROM`repayment` r LEFT JOIN app_user u ON r.user_id = u.id WHERE `repay_status` = '已还'GROUP BY r.user_id,r.apply_idorder by user_id,r.apply_id
)b

  效果如下:

  较子查询而言,这种方法执行效率更高。

三、多期产品

  多期产品需要注意的地方是:

  每一个订单对应着不同期数的还款记录。比如:6期的产品,就有6行贷后数据。我们要先把单笔借款的最后一期还款记录单独提取后再执行如单期产品相同的sql即可。

四、总结

  • 今天,我们针对一个简单的金融场景需求(统计复借次数)做了一些简单sql的尝试,主要成果如下:

    • ① 金融产品复借次数的定义方法
    • ② mysql、sql_server、oracle等数据库对应的sql函数有区别。mysql在无法使用oracle的一些高级分析函数的时候,可以通过底层sql来实现一些如组内统计、组内排序的功能。
    • ③ 到达一个目的地,往往有多条路径,我们都想要找最优美的那条。
    • ④ 小伙伴们如果还有其他实现这个功能的方式,欢迎评论,或者在公众号留言。

  其实,sql能力的加强,就在于有效处理这种看起来简单实际上复杂的问题,一次次的训练,一次次的提升。

五、番外


  对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料,可添加微信:wu805686220(记得要备注喔!),也可关注微信公众号:风控圏子(别打错字,是圏子,不是圈子,算了直接复制吧!)

关注公众号后,可联系圈子助手加入如下社群:

  • 机器学习风控讨论群(微信群)
  • 反欺诈讨论群(微信群)
  • python学习交流群(微信群)
  • 研习社资料(qq群:102755159)(干货、资料、项目、代码、报告、课件)

相互学习,共同成长。

【数据库】SQL极速入门(多种方式查询用户复借次数)相关推荐

  1. sql server 入门_SQL Server查询调整入门

    sql server 入门 This article will cover some essential techniques for SQL query tuning. Query tuning i ...

  2. 数据库 SQL Server 视图 创建视图 查询视图 修改视图 删除视图

    文章目录 1 视图概述 2 创建视图 3 查询视图 4 修改视图 5 删除视图 总结 1 视图概述 视图就是将一个或多个表中的目标字段抽取出来形成的一个虚拟表.这个虚拟表和真实的表具有相同的功能. 视 ...

  3. Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法

    默认看到查询条件有 3 条结果,我想只查询出日期最晚的那一条记录. -- 默认查询条件 select settledate as "日期", syscalculationmny a ...

  4. 使用SQL语句对重复记录查询、统计重复次数、删除重复数据

    上周工作中数据库中出现了N多重复记录的情况,导致联合查询时数据异常.由于数据是客户提供的,当时并没有提供唯一标识列,而且也没预料到会出现重复数据.哎,大意了.后来对表中的数据进行了一次重复查询. 1. ...

  5. SQL Server入门(四) 官网关于 SQL Server初级入门教程

    原文http://www.shareblogs.top/444/ 学习内容 这些教程将帮助你理解 SSMS 中提供的信息以及如何利用其功能. 熟悉 SSMS 的最好方式是进行实践演练. 这些教程将使你 ...

  6. 计算机导论sql试题,数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  7. APP查询用户购买套餐使用量和套餐总数

    查询用户购买套餐使用量和套餐总数,根据查询用户一共购买了套餐发布职位数量的总数,查询用户使用多少发布职位次数 查询用户购买套餐下载简历总数,查询用户使用了多少次下载简历,查询用户一共购买了套餐短信数量 ...

  8. 多种方式进行数据库的批量删除(删除用户信息为例)

    本文讲述的是多种方式进行数据库的批量删除(以删除用户信息为例) 方式一: /*** 批量删除用户* * 使用事务处理方式进行删除 * * @param userIds* @return*/public ...

  9. 数据库SQL语言从入门到精通--Part 3--SQL语言基础知识

    数据库从入门到精通合集(超详细,学习数据库必看) 一.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 从用户角度,关系模型中数据的逻辑结构是 ...

最新文章

  1. 后台接口向数据库录入汉字时乱码以及自动过滤文字经验总结
  2. 每天学习30分钟新知识之html教程1
  3. keystone连接mysql_3、KeyStone服务部署与验证
  4. 虚拟机从暂停状态恢复后HEALTH_WARN,osds down
  5. fmt.Println、fmt.Printf、fmt.Sprintf、fmt.Sprintln
  6. apex英雄机器人探路者怎么玩_Apex英雄探路者机器人实战技巧攻略[多图]
  7. Future和Promise
  8. TCP 滑动窗口(已经发出等待对方确认的队列)协议
  9. 关闭浏览器网页触发事件_浏览器是如何工作的?
  10. yum与apt-get的区别以及两者更新源(阿里/网易【163】)
  11. Spring的9种设计模式(二)
  12. 电脑如何使用硕鼠批量下载哔哩哔哩视频
  13. python神经网络预测股票组合_神经网络预测股票市场
  14. 计算机数字键盘无法输入数字,电脑数字键打不出数字怎么办?电脑数字键打不出数字的修复方法...
  15. 基于51单片机的简易电容值测量仪proteus仿真设计
  16. uva10306 - e-Coins(完全背包)
  17. bim学习—— 第7章 放置幕墙门窗
  18. 面朝大海,春暖花开,有wifi
  19. android 开发英语单词统计
  20. 聚焦城市数字化转型 CDEC2021中国数字智能生态大会上海站今日举行

热门文章

  1. acid php5,ACID原则
  2. axure rp制作输入法_Axure教程丨制作自己的Axure元件库
  3. Java中的对象序列化操作
  4. 访问tomcat html,访问云服务器tomcat里html界面
  5. 加拿大留学商科好还是计算机科学好,去加拿大读商科专业就是要选择这些才最好!...
  6. 佩珀代因大学计算机科学专业,佩珀代因大学计算机科学与数学本科专业.pdf
  7. linux系统虚拟化测试,网络性能与磁盘测试 - Linux虚拟化性能PK:Ubuntu系统6大版本_Linux新闻_Linux公社-Linux系统门户网站...
  8. 织梦?php?调用栏目,dedecms列表页内容页模板调用上一个栏目下一个栏目方法
  9. 2018-11-18年工作感想
  10. yolov3-tf2 数据格式压缩