每天一道大厂SQL题【Day15】微众银行真题实战(五)
每天一道大厂SQL题【Day15】微众银行真题实战(五)
大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。
一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!
每日语录
第15题:逾期率统计
需求列表
基于附录2《借据表》统计下述指标,请提供Vintage统计SQL(mobX指的是发放后第X月末的不良余额/发放月金额)
| 发放月份 | 发放金额 | MOB1 | MOB2 | MOB3 | MOB4 | MOB5 | MOB6 | MOB7 | MOB8 | MOB9 | MOB10 | MOB11 | MOB12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2019-10 | |||||||||||||
| 2019-11 | |||||||||||||
| 2019-12 | |||||||||||||
| 2020-01 | |||||||||||||
| 2020-02 | |||||||||||||
| 2020-03 | |||||||||||||
| 2020-04 | |||||||||||||
| 2020-05 | |||||||||||||
| 2020-06 | |||||||||||||
| 2020-07 | |||||||||||||
| 2020-08 | |||||||||||||
| 2020-09 | |||||||||||||
| 2020-10 |
数据准备
链接:https://pan.baidu.com/s/1Wiv-LVYziVxm8f0Lbt38Gw?pwd=s4qc
提取码:s4qc
debt.txt文件
set spark.sql.shuffle.partitions=4;
create database webank_db;
use webank_db;
create or replace temporary view check_view (ds comment '日期分区',
sno comment '流水号', uid comment '用户id',
is_risk_apply comment '是否核额申请',
is_pass_rule comment '是否通过规则',
is_obtain_qutoa comment '是否授信成功', quota comment '授信金额',
update_time comment '更新时间')
as
values ('20201101', 's000', 'u000', 1, 1, 1, 700, '2020-11-01 08:12:12'),
('20201102', 's088', 'u088', 1, 1, 1, 888, '2020-11-02 08:12:12'),
('20201230', 's091', 'u091', 1, 1, 1, 789, '2020-12-30 08:12:12'),
('20201230', 's092', 'u092', 1, 0, 0, 0, '2020-12-30 08:12:12'),
('20201230', 's093', 'u093', 1, 1, 1, 700, '2020-12-30 08:12:12'),
('20201231', 's094', 'u094', 1, 1, 1, 789, '2020-12-31 08:12:12'),
('20201231', 's095', 'u095', 1, 1, 1, 600, '2020-12-31 08:12:12'),
('20201231', 's096', 'u096', 1, 1, 0, 0, '2020-12-31 08:12:12')
;
--创建核额流水表
drop table if exists check_t;
create table check_t (
sno string comment '流水号', uid string,
is_risk_apply bigint, is_pass_rule bigint, is_obtain_qutoa bigint, quota decimal(30,6), update_time string
) partitioned by (ds string comment '日期分区');
--动态分区需要设置
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table check_t partition (ds) select sno,
uid, is_risk_apply, is_pass_rule, is_obtain_qutoa, quota,
update_time,
ds
from check_view;

-- 创 建 借 据 表
create table debt(
duebill_id string comment '借据号',
uid string, prod_type string,
putout_date string,
putout_amt decimal(30, 6),
balance decimal(30, 6),
is_buliang int,
overduedays int
)partitioned by (ds string comment '日期分区');
--资料提供了一个34899条借据数据的文件
--下面补充如何将文件的数据导入到分区表中。需要一个中间普通表过度。
drop table if exists webank_db.debt_temp;
create table webank_db.debt_temp(
duebill_id string comment '借据号', uid string,
prod_type string,
putout_date string, putout_amt decimal(30, 6),
balance decimal(30,6),
is_buliang int, overduedays int,
ds string comment '日期分区'
) row format delimited fields terminated by 't';load data local inpath '/root/debt.txt' overwrite into table webank_db.debt_temp;--动态分区需要设置
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table webank_db.debt partition (ds)
select * from webank_db.debt_temp;--技巧:如果查询debt表,由于分区数太多,导致查询很慢。
-- 开发阶段,我们可以事先将表缓存起来,并且降低分区数比如为6,那么查缓存表大大提升了开发效率。
-- 上线阶段,再用实际表替换缓存表。
--首次缓存会耗时慢
cache table cache_debt as select /+ coalesce(6) / from
debt;
--第二次使用缓存会很快
select count(*) from cache_debt;
select ds,count(1) from cache_debt group by ds;
思路分析
随机观察2个借据的情况
*select* * *from* cache_debt *where* duebill_id='u001-1' *order by* ds;*select* * *from* cache_debt *where* duebill_id='u005-2' *order by* ds;


分3个大步骤:
步骤1:形成临时表1_每月的总发放金额
| 发放月份 | 发放金额 |
|---|---|
| 2019-10 | aa |
| 2019-11 | bb |
| 2019-12 | cc |
| 2020-01 | dd |
| 2020-02 | ee |
| 2020-03 | ff |
| 2020-04 | gg |
| 2020-05 | hh |
步骤2:形成临时表2_发放后第几个月末时的不良余额
| 发放后第几个月末时的不良余额(元) | ||||||||
|---|---|---|---|---|---|---|---|---|
| 发放月份 | 1月后 | 2月后 | 3月后 | 4月后 | 5月后 | 6月后 | 7月后 | 8月后 |
| 2019-10 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 |
| 2019-11 | b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 |
| 2019-12 | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 |
| 2020-01 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 |
| 2020-02 | e1 | e2 | e3 | e4 | e5 | e6 | e7 | e8 |
| 2020-03 | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 |
| 2020-04 | g1 | g2 | g3 | g4 | g5 | g6 | g7 | g8 |
| 2020-05 | h1 | h2 | h3 | h4 | h5 | h6 | h7 | h8 |
步骤3:用上面的临时表1关联临时表2,用临时表2的每个值除以临时表的总金额。
| 发放后第几个月末时的不良余额占发放金额的比例 | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| 发放月份 | 发放金额 | 1月后 | 2月后 | 3月后 | 4月后 | 5月后 | 6月后 | 7月后 | 8月后 |
| 2019-10 | aa | a1/aa | a2/aa | a3/aa | a4/aa | a5/aa | a6/aa | a7/aa | a8/aa |
| 2019-11 | bb | b1/bb | b2/bb | b3/bb | b4/bb | b5/bb | b6/bb | b7/bb | b8/bb |
| 2019-12 | cc | c1/cc | c2/cc | c3/cc | c4/cc | c5/cc | c6/cc | c7/cc | c8/cc |
| 2020-01 | dd | d1/dd | d2/dd | d3/dd | d4/dd | d5/dd | d6/dd | d7/dd | d8/dd |
| 2020-02 | ee | e1/ee | e2/ee | e3/ee | e4/ee | e5/ee | e6/ee | e7/ee | e8/ee |
| 2020-03 | ff | f1/ff | f2/ff | f3/ff | f4/ff | f5/ff | f6/ff | f7/ff | f8/ff |
| 2020-04 | gg | g1/gg | g2/gg | g3/gg | g4/gg | g5/gg | g6/gg | g7/gg | g8/gg |
| 2020-05 | hh | h1/hh | h2/hh | h3/hh | h4/hh | h5/hh | h6/hh | h7/hh | h8/hh |
答案获取
建议你先动脑思考,动手写一写再对照看下答案,如果实在不懂可以点击下方卡片,回复:大厂sql 即可。
参考答案适用HQL,SparkSQL,FlinkSQL,即大数据组件,其他SQL需自行修改。
加技术群讨论
点击下方卡片关注 联系我进群
或者直接私信我进群
微众银行源数据表附录:
- 核额流水表
| 字段名 | 字段意义 | 字段类型 |
|---|---|---|
| ds | 日期分区,样例格式为20200101,每个分区有全量流水 | string |
| sno | 每个ds内主键,流水号 | string |
| uid | 户id | string |
| is_risk_apply | 是否核额申请(核额漏斗第一步)取值0和1 | bigint |
| is_pass_rule | 是否通过规则(核额漏斗第二步)取值0和1 | bigint |
| is_obtain_qutoa | 是否授信成功(核额漏斗第三步)取值0和1 | bigint |
| quota | 授信金额 | decimal(30,6) |
| update_time | 更新时间样例格式为2020-11-14 08:12:12 | string |
- 借据表
| 字段名 | 字段意义 | 字段类型 |
|---|---|---|
| ds | 日期分区,样例格式为20200101每个分区有全量借据 | string |
| duebilid | 借据号(每个日期分区内的主键) | string |
| uid | 用户id | string |
| prod_type | 产品名称仅3个枚举值XX贷YY贷ZZ贷 | string |
| putout_date | 发放日期样例格式为2020-10-10 00:10:30 | bigint |
| putout_amt | 发放金额 | decimal(30,6) |
| balance | 借据余额 | decimal(30,6) |
| is_buliang | 状态-是否不良取值0和1 | bigint |
| overduedays | 逾期天数 | bigint |
- 模型输出表
| 字段名 | 字段意义 | 字段类型 |
|---|---|---|
| ds | 日期分区,样例格式为20200101增量表部分流水记录可能有更新 | string |
| sno | 流水号,主键 | string |
| create time | 创建日期样例格式为2020-10-10 00:10:30与sno唯一绑定,不会变更 | string |
| uid | 用户id | string |
| content | son格式key值名称为V01~V06,value值取值为0和1 | string |
| create_time | 更新日期样例格式为2020-10-1000:10:30 | string |
文末SQL小技巧
提高SQL功底的思路。
1、造数据。因为有数据支撑,会方便我们根据数据结果去不断调整SQL的写法。
造数据语法既可以create table再insert into,也可以用下面的create temporary view xx as values语句,更简单。
其中create temporary view xx as values语句,SparkSQL语法支持,hive不支持。
2、先将结果表画出来,包括结果字段名有哪些,数据量也画几条。这是分析他要什么。
从源表到结果表,一路可能要走多个步骤,其实就是可能需要多个子查询,过程多就用with as来重构提高可读性。
3、要由简单过度到复杂,不要一下子就写一个很复杂的。
先写简单的select from table…,每个中间步骤都执行打印结果,看是否符合预期, 根据中间结果,进一步调整修饰SQL语句,再执行,直到接近结果表。
4、数据量要小,工具要快,如果用hive,就设置set hive.exec.mode.local.auto=true;如果是SparkSQL,就设置合适的shuffle并行度,set spark.sql.shuffle.partitions=4;
后记
📢博客主页:https://manor.blog.csdn.net
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 Maynor 原创,首发于 CSDN博客🙉
📢不能老盯着手机屏幕,要不时地抬起头,看看老板的位置⭐
📢专栏持续更新,欢迎订阅:https://blog.csdn.net/xianyu120/category_12182595.html
相关文章:
每天一道大厂SQL题【Day15】微众银行真题实战(五)
每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…...
如何优化查询大数据量的表
给你100万条数据的一张表,你将如何查询优化?1.两种查询引擎查询速度(myIsam 引擎 )InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多…...
卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......
经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对测试工具的使用感到困扰?前言性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性…...
力扣-树节点
大家好,我是空空star,本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目:608. 树节点二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …...
MySQL8启动错误“Neither found #innodb_redo subdirectory, nor ib_logfile* files”
今天做MySQL备份文件回复测试,用来检验MySQL备份文件可用性。 MySQL版本8.0.32 备份文件为腾讯云MySQL实例,版本8.0 使用xtrabackup恢复备份。执行过程顺利,启动MySQL时发生错误。提示如下: 注意,这里使用了systemctl stop mysql。虽然启动失败了,但是如果不执行这条…...
JVM系列——详细说明Volatile,原子性/可见性,先行发生原则
上篇我们讨论了JMM中的工作内存和主内存、内存直接的交互指令,以及指令之间的顺序规则。 本篇将会以上篇为基础,详细介绍并发编程中的三个重要概念/工具:Volatile、原子性/可见性和先行发生(happens-before)原则。 volatile型变量…...
ArcGIS:栅格计算器的运算符和函数详解
01 栅格计算器在哪?02 运算符说明栅格计算器的表达式书写与Python语法一致(由于其为解释型语言并且语言简洁优美,因此简单上手),这里主要简单说明各个运算符即可使用栅格计算器构建地图代数表达式以输出要求的栅格图像…...
spring的beanfactory与applicationContext的区别以及继承关系
applicationContext继承关系 首先可以看一张图 ListableBeanFactory 可列举的bean工厂 hierarchical 分层bean工厂 messageSource 国际化信息 //国际化(internationalization)是设计和…...
分享一个 hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题
最近在针对某系统进行性能优化时,发现了一个hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题,该问题具有普适性,故特地拿出来跟大家分享下。 1 问题描述 在微服务中,我们普遍会使用各种数据库连接池技术以加快…...
MySQL 行锁
行锁 : 对表中行记录的锁 MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁 两阶段锁协议 : 行锁是在需要时才加上,要等到事务结束才释放 例子 : id 是表 t 的主键的 B 的 update 会阻塞,直到 A 执行 commit 后,B 才能…...
成为AI架构师的三大能力
AI架构师的定义 “AI 架构师”是以深度学习为代表的第三次AI热潮所催生的新型复合型人才,它的产生最本质的驱动因素是AI产业化落地应用的蓬勃发展对人才的需求,深度学习突出的工程属性也特别需要复合型人才来驾驭。 从字面来看,AI架构师的“…...
博客系统 实现 (前端 + 后端 )代码
文章目录博客系统前端代码 :1. add.html2. blog_detail.html3. blog_edit.html4. blog_list.html5. login.htmlcss 文件1. blog_detail.css2. blog_edit.css3. blog_list.css4. common.css5. login.css6. 分页器使用的 css后端代码1.config 包1.1 AppConfig类1.2 Lo…...
C语言:如何在cmd命令窗口上玩贪吃蛇游戏
最近在重新学习C语言知识,还别说,在这个过程中,我还真的学到了过去很多没有学习到C语言知识,于是就做了这个游戏–贪吃蛇. 运行结果如下: C语言:如何在cmd命令窗口上玩贪吃蛇游戏 文章目录 1. 实现原理2. 实现过程3. 参考代码1. 实现原理 其实,就是利用了人的视觉错觉来…...
Flutter-自定义图标
虽然Flutter有许多内置的icon图标,但是有些特殊功能的话,需要自定义图标或者需要在iconfont 阿里巴巴的图标库里找对应合适的图标。 第一步:在iconfont 阿里巴巴里搜索想要的图标并加入到购物车,点击下载代码后,会生成…...
教学场景应用视频试看预览功能
html5播放器视频预览功能效果 - 视频预览代码示例预播放一小段时间的视频内容,比如3分钟,然后引导用户付费观看或注册会员观看完整视频。原理:视频播放结束,执行s2j_onPlayOver()函数,显示提示信息或对话框,…...
关于进程与进程调度
目录什么是进程进程管理进程的结构体(PCB)里的属性并行与并发什么是进程 一个运行起来的程序就是进程. 比如文件名是以 exe 结尾的就是一可执行文件(程序) 双击QQ.exe文件, 这个程序就跑起来了, 它在系统中形成了一个进程, 那我们怎么看到进程呢? 可以打开任务管理器, 点开进…...
Redis常用命令及数据类型参数
1. 针对于string SET key value / GET key SET k1 v1 GET k1 // v1String是二进制安全的,是可变长度的, 底层类似于ArrayList 是可扩容的,最大存储内存为 512MB。 2. 判断key中是否存在某个内容 EXISTS key SET k1 v1 EXISTS k1 // …...
(七十四)大白话深入探索多表关联的SQL语句到底是如何执行的?(2)
今天咱们就以MySQL单表查询来举例,看看执行计划到底包含哪些内容 其实只要大家跟着专栏一步一步的学习下来,会很轻松的看懂执行计划,但是如果你之前对什么数据页,索引,索引使用规则,这些东西学的不扎实&am…...
销售使用CRM系统集成Excel的五个技巧
销售过程中有很多情况会降低团队的效率。通过正确的实施CRM客户管理系统,可以帮助您的企业自动执行手动任务、减少错误并专注于完成交易。这里有5个技巧,可以帮助您的销售人员通过CRM集成Excel为销售流程赋能并提高他们的整体效率。 技巧1:将…...
过来人告诉你:Java学到什么程度可以找工作?
大部分初次学习Java的同学都非常关注自己学到什么程度可以找工作就业,因为学习的目的一方面在于掌握知识、提高技能,另一方面就是就业谋生。今天笔者就来跟大家聊一聊一下Java学习到什么地步可以面试找工作。任何企业,不论大小,对…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
