蚂蚁面试SQL-花呗逾期分析

推荐阅读文章列表

大数据开发面经汇总【持续更新...】

我的大数据学习之路

大数据开发面试笔记V6.0

SQL题目

来自蚂蚁数据研发一面

  • 有一张用户贷款信息表dwd_trd_loan_tb_dd,包含uid(用户id)、amt(贷款金额)、ovd_days(逾期天数)、dt(时间分区)以及逾期等级配置表dim_ovd_config_dd,包含ovd_days(逾期天数),user_level(用户风险等级)
  • 注意:当ovd_days=1且user_level=1,表示用户逾期天数<=1时,用户风险等级都为1;当ovd_days=30且user_level=2,表示用户逾期天数>1同时<=30时,用户风险等级为2;
  • 问题:计算20241011日所有贷款用户对应的风险等级
-- 举例如下:
-- 输入
-- dwd_trd_loan_tb_dd
uid   amt   ovd_days     dt
1001  1000     0       20241011
1002  1000     33      20241011
1003  1000     12      20241011
1004  1000     68      20241011
-- dim_ovd_config_dd
ovd_days  user_level
1             1
30            2
60            3
180           4
-- 输出
uid   user_level
1001      1
1002      3
1003      2
1004      4

答案解析

模拟数据

create table dwd_trd_loan_tb_dd (
uid varchar(20),
amt bigint,
ovd_days bigint,
dt varchar(20)
);
create table dim_ovd_config_dd (
ovd_days bigint,
user_level bigint
);
INSERT INTO dwd_trd_loan_tb_dd VALUES 
('1001',1000,0,'20241011'),
('1002',1000,33,'20241011'),
('1003',1000,12,'20241011'),
('1004',1000,68,'20241011')
;
INSERT INTO dim_ovd_config_dd VALUES 
(1,1),
(30,2),
(60,3),
(180,4)
;

思路分析

  • 看到多张表,先进行JOIN,但是一眼看去好像只能用逾期天数进行关联,可以又无法直接关联,那么就笛卡尔积(考虑到配置表很小)
  • 这时候我们就需要判断每个用户的逾期天数是否小于所有配置的逾期天数,如果小于记为1,这时候会出现一个用户对应多个1,我们要取对应配置逾期天数最小的那一条,怎么办?
  • 按照uid进行分组,配置逾期天数进行排序,对标志位进行求和,最后取开窗结果为1的行记录即可

具体代码

select 
	uid, 
	user_level
from (
	select
		t1.uid,
		t1.ovd_days,
		t2.ovd_days as ovd_days_config,
		t2.user_level,
		sum(if(t1.ovd_days < t2.ovd_days, 1, 0))  over(partition by t1.uid order by t2.ovd_days) as total_cnt
	from (
		select * 
		from dwd_trd_loan_tb_dd
		where dt = '20241011'
	) t1
	join (
		select * 
		from dim_ovd_config_dd
	) t2
	on 1 = 1
) t
where total_cnt = 1
;

#数据人的面试交流地##大数据开发##SQL面试#
全部评论
您好,我请教一下,这个题从那进去的呢?
1 回复 分享
发布于 10-17 15:16 北京
SELECT DISTINCT uid, MIN(user_level) over(partition by uid) as user_level FROM( SELECT t1.uid, t1.ovd_days, t2.ovd_days as ovd_days_config, t2.user_level FROM ( SELECT * FROM dwd_trd_loan_tb_dd WHERE dt='20241011' )t1, dim_ovd_config_dd t2 )t3 WHERE ovd_days<=ovd_days_config;
点赞 回复 分享
发布于 10-22 15:12 广西
用第一个表写一下case when感觉就行了啊,都写这么麻烦吗
点赞 回复 分享
发布于 10-24 15:19 浙江

相关推荐

查看4道真题和解析 运营商笔面经互助
点赞 评论 收藏
分享
#牛客创作赏金赛##完美世界#8月份就投了完美世界,10月校园宣讲会又交了纸质简历,结果11月才收到面试通知,估计是开奖后有人又拒了,面试官整体还是很好的,是一次不错的体验,下次还来。1、自我介绍,深挖实习经历2、如何分析王者皮肤的偏好度,感觉答的还行3、如何分析王者用户流失,我答的之前实习时用的分析方法,由于实习不是游戏行业,感觉对于游戏行业的流失分析没什么用,我也不太了解如何分析游戏行业的流失,所以这题答的很差4、如何分析游戏收入下滑,跟上一题一样没什么思路5、如何预测游戏流水,我答的时间序列分析中的ARIMA,还有深度学习中的LSTM,但是选取哪些特征进行训练神经网络我没答出来,我也不知道游戏里面有哪些特征适合用来训练6、王者荣耀数值模型如何拆解,通过我上一篇面经复盘,我觉得答的比较好,用的PDE,但是似乎HR不懂这块知识7、SQL题,计算次日留存率,我答了两种方法,一种是窗口函数,一种是两个表日期加一然后内连接,这是牛客刷题刷出来的,这个牛客免费题库还是很有用的8、职业规划,技术方向还是业务方向,我答的都行,其实我两边都懂点,但都不精9、能否提前实习,秋招0offer选手自然是随时都能实习10、反问,面试缺点,HR说我说话太快了,很多地方没有听清楚,我面试真的很紧张,希望我把专业术语说的慢一点,把算法和PDE讲的更清楚一点,但是我感觉用语言描述确实不够直观,毕竟是学数学的,我以后可能会尝试主动共享屏幕手推公式,手推算法,这样会更清楚一点。最后,这是我秋招,哦不甚至是人生中目前最长的面试了,面试了40分钟,非常感谢完美世界给我的这次宝贵的机会,宣讲会的时候看到宣传片真的还挺向往这样的公司的,非常可惜,江湖再见吧。(ps完美世界每年秋招春招都会来,真的很爱)
查看10道真题和解析 牛客创作赏金赛
点赞 评论 收藏
分享
1 15 评论
分享
牛客网
牛客企业服务