面试官居然让具有五年经验的同学写SQL代码
面试题来源于社群内的一位具有五年数仓开发经验的同学在面试美团的时候记录的SQL题
~~如果有对其中任意一道题目的答案有疑问的同学,可以在评论区和我进行讨论~~
一面
需求描述
订单基础表order_base ------------------- order_id 订单id bus_id 商家id user_id 用户id amt 支付金额 dt 日期【分区】
- 统计每个月支付金额排名前3的用户id
- 展示每个用户每月的最大支付金额和截止到该月的总支付金额
答案解析
-- 统计每个月支付金额排名前3的用户id
select month
,user_id
from (
select month
,user_id
,row_number() over(partition by month order by total_amt desc) as rn
from (
select date_format(dt, '%Y-%m') as month
,user_id
,sum(amt) as total_amt
from order_base
group by month, user_id
) t
) t
where rn <= 3
;
-- 统计每个用户每个月的最大支付金额和截止到该月的总支付金额
select useid
,month
,max(month_max_actual_amt) as month_max_actual_amt
,max(total_actual_amt) as total_actual_amt
from (
select user_id
,date_format(dt, '%Y-%m') as month
,max(amt) over(partition by user_id, date_format(dt, '%Y-%m')) as max_amt
,sum(amt) over(partition by user_id order by date_format(dt, '%Y-%m')) as total_amt
from order_base
) t
group by month, user_id
;
二面
需求描述
日期节气表jq_t --------------- dt 日期 jieqi 节气【比如立夏】
- 增加一列season列,枚举值:春、夏、秋、冬,jq_t表中日期没有对应节气的就需要进行推算,假设1号为立夏,15号为立春,那么就可以推测出1号到15号为夏季
答案解析
select t1.dt
,t1.jieqi
,t2.season
from info t1
left join (
select dt
,jieqi
,season
,lead(dt, 1, '99999999') over(order by dt) as next_dt
from (
select dt
,jieqi
,case when jieqi = '立春' then '春'
when jieqi = '立夏' then '夏'
when jieqi = '立秋' then '秋'
else '冬' end as season
from info
where jieqi in ('立春','立夏','立秋','立冬')
) t
) t2
on 1=1
where t1.dt >= t2.dt and t1.dt < t2.next_dt
;
不管是校招还是社招的同学,SQL一定要熟练掌握!!!
有兴趣的可以看一下我笔记里面总结的常见HQL面试题:2023最新大数据开发面试笔记V4.0
不要一味的认为SQL很简单,总结的一些复杂需求还是非常有难度的,并且面试经常会考!!!
#数据人的面试交流地##大数据##SQL练习##面经##社招#大厂高频面试SQL题 文章被收录于专栏
收录字节、阿里、蚂蚁、美团、京东、百度、小红书、拼多多等大厂面试SQL题

查看11道真题和解析