面试官居然让具有五年经验的同学写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练习##面经##社招#
全部评论
路过的兄弟点个赞呗~
2 回复
分享
发布于 2023-07-01 13:34 浙江
SQL不需要那么复杂,实在复杂的丢业务代码里
1 回复
分享
发布于 2023-07-04 00:02 广西
滴滴
校招火热招聘中
官网直投

相关推荐

16 51 评论
分享
牛客网
牛客企业服务