大数据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 string,
amt int,
ovd_days int,
dt string
);
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的行记录即可

第一步:先将两个表关联

with t as (
    select l.*,l.ovd_days lovd_days,c.*,c.ovd_days covd_days from dwd_trd_loan_tb_dd l
        join dim_ovd_config_dd c
      on 1=1
)
select * from t ;

with t as (
    select l.*,l.ovd_days lovd_days,c.*,c.ovd_days covd_days from dwd_trd_loan_tb_dd l
        join dim_ovd_config_dd c
      on 1=1
)
select uid,min(user_level) from t where lovd_days < covd_days group by uid  ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闫哥大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值