【蚂蚁SQL面试题】蚂蚁数据研发一面面试题

蚂蚁数据研发面试题:计算贷款用户风险等级问题解析

一、问题背景

在数据处理中,我们有两张表,一张是用户贷款信息表dwd_trd_loan_tb_dd,包含uid(用户 id)、amt(贷款金额)、ovd_days(逾期天数)、dt(时间分区);另一张是逾期等级配置表dim_ovd_config_dd,包含ovd_days(逾期天数)、user_level(用户风险等级)。例如,当ovd_days = 1user_level = 1,表示用户逾期天数 <= 1 时,用户风险等级都为 1;当ovd_days = 30user_level = 2,表示用户逾期天数 > 1 同时 <= 30 时,用户风险等级为 2。问题是计算 20241011 日所有贷款用户对应的风险等级。

二、测试数据准备

以下是创建表和插入测试数据的 SQL 代码:

sql 复制代码
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);

三、思路分析

  1. 表关联问题
    看到多张表,首先考虑进行 JOIN。但初看只能用逾期天数进行关联,却又无法直接关联,由于配置表数据量小,这里可以考虑笛卡尔积。
  2. 数据处理问题
    在笛卡尔积后,需要判断每个用户的逾期天数是否小于所有配置的逾期天数,如果是则保留。这样会出现一个用户对应多个等级的情况,此时我们要取对应配置逾期天数最小的那一条。解决方法是按照uid进行分组,对配置逾期天数取最小值即为所需。

四、解题步骤

  1. 第一步:表关联
    首先将两个表进行关联,使用以下 SQL 代码:
sql 复制代码
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 ;
  1. 第二步:计算用户风险等级
    在关联后的基础上,通过以下 SQL 代码计算每个用户的最小风险等级:
sql 复制代码
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  ;

通过以上步骤,我们可以计算出 20241011 日所有贷款用户对应的风险等级。这种方法通过巧妙的表关联和数据处理逻辑,解决了看似复杂的多表数据计算问题。希望这篇博客对大家理解此类数据处理问题有所帮助。

相关推荐
爱上口袋的天空13 分钟前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
转世成为计算机大神17 分钟前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_3273427339 分钟前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF2 小时前
m个数 生成n个数的所有组合 详解
java·递归
代码小鑫2 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖2 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
Yang.992 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
周全全3 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php