SQL业务查询题 | 解题思路&代码分析

SQL是作为一名数据分析师必备的技能,在笔试/面试中我们经常会遇到各种SQL查询题,特别是对于工作相关的业务指标的计算。这篇文章中我将各种SQL业务查询题进行汇总。

题目1:求销量排名前三的二级类目

已知一个订单表,有字段:订单号、日期(date)、下单时间、下单金额(amount)、商品一级类目(type_1)、商品二级类目(type_2)。求最近7天内每一个一级类目下成交总额排名前3的二级类目。

解题思路:

  1. 首先要筛选出7天内的订单数据:datediff(now(),date) between 0 and 7
  2. 对每个一级类目下各个二级类目成交总额进行排名,需要同时对一级类目和二级类目进行分组,然后对每个一级类目下二级类目的金额进行求和排序。这里可以使用窗口函数:rank() 或者 dense_rank() 新建一个排名字段(ranking),按一级类目分块,按求和后的成交总额进行从大到小排序
  3. 最后保留排名 < = 3 <=3 <=3 的数据,即为所求

具体代码:

SELECT type_1, type_2, total_amt FROM (
	SELECT type_1, type_2,
		SUM(amount) total_amt,
		dense_rank() over (partition by type_1 order by SUM(amount) DESC) dense_ranking
	FROM order_log
	WHERE DATEDIFF(now(),date) BETWEEN 0 AND 7
	GROUP BY type_1, type_2
	ORDER BY type_1, dense_ranking
	) p
WHERE dense_ranking <= 3

相似问题:求每个班代课次数最多的老师信息

从表lesson中,提取n_minutes(分钟数)>30的记录中,每个班级中代课次数最多的老师id及姓名

字段 解释
c_id 班级id
t_id 教师id
t_name 教师名字
n_minutes 上课分钟数

具体代码

SELECT c_id, t_id, t_name
FROM (
	SELECT 
		c_id, 
		t_id, 
		t_name,
		rank() over(partition by c_id order by count(1) desc) ranking
	FROM class_log
	WHERE n_minutes > 30
	GROUP BY c_id, t_id, t_name
	) p
WHERE ranking = 1

题目2:每日留存率计算

表名:user_log

字段 解释
log_day 登录日期
device_id 用户设备id
app_id 用户app_id

其中 device_id 和 app_id 确定唯一的用户
要求计算每日的次日、3日、7日留存率

解题思路:

  1. 建立子查询:使用 left join 配合 datediff 函数,并将数据按日期进行 group by,计算每日的:
    活跃用户数 ——当天活跃的用户数
    次日留存用户数 ——当天活跃用户数中次日仍活跃的用户数
    3日留存用户数 ——当天活跃用户数中3日后仍活跃的用户数
    7日留存用户数 ——当天活跃用户数中7日后仍活跃的用户数
  2. 建立主查询:根据子查询结果,计算每日的:
    次日留存率 ——次日留存用户数 / 活跃用户数
    3日留存率7日留存率 同理

具体代码:

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值