case when 子查询_MySQL查询面试题(持续更新)

5c2308bb82d2e8ed6c0d360b4298fa6b.png

前言

资源全部来自于网络,我会尽量在每一题上都写上注释,没什么好说的,做就完事了。

第一题 计算月最大值

b64d11b8185776651db8b4f3218a1a2f.png
-- 建表

第二题 计算性别合计

b7970bcfd48c78cdaec1817a4ecbb83a.png

计算各院系的男女计数以及合计。

-- 建表

第三题 计算仓库合计(动态SQL)

14024ea473069589f9e89fd8fa26ce1c.png

使用动态SQL,仓库并不一定只有例子中的1234,可能有5678。 我的想法是这是个行列转换的题,用case...when语句,但是仓库的值不确定,所以考虑变量设置SQL语句。

  1. 先查询表中的非重复仓库
  2. 子查询group by,通过select向字符串变量里循环添加case...when语句
  3. 外层再嵌套一个group by,最后拼接所有的变量sql字符串
  4. 使用预处理执行sql语句
如果是静态SQL,就需要像上面一体不停的根据表中仓库变化,自己手动添加case,运用动态SQL就不需要自己手动添加 这个解法硬解可以,但肯定不是最好,希望有更好的解法。
-- 建表

第四题 计算年月累计值

d6cfda59eaebbe36438182e33f38f0c6.png

需要求的是月合计,年累加,总累加。

-- 删除表

第五题 前n个字符串拼接

adc585b8e5a3da3619afa97510b5d345.png

求userid对应前两个不同的场景,如果场景重复则选择第一次访问时间,场景号不足两个的输出一个即可。

我的思路是先根据userid和area分组,此时出来的数据就是每个user去过的每个area,再使用窗口函数赋予排名,将排名<=2取出,最后再根据userid分组进行concat拼接。

-- 删除表

第六题 连续签到问题

用户每天打卡一次为一条数据,可能存在重复行,同一天多条打卡记录算作一天打卡,假设今天为2020/08/06。

-- 删除表

查询2020/08/06当天打卡的用户。

416c8025e1f4c26a6f884b670e08af99.png
SELECT 

现在有个七天活动,活动时间是从2020/07/31-2020/08/06的,我想知道2020/08/06这一天每个用户最近打卡日期及活动累计登录天数 。

c69a5faac9eb76af6b7512d3caaaac6e.png
SELECT 

我想查询截止至2020/08/06当天连续打卡3天的用户(包含2020/08/06)。

319734ba71a9882d16075acca4abb10f.png
SELECT 

用户历史最大连续签到天数及该次记录的最后一天签到日期。(这题自己随便想的,实在是没什么好的解法)

084fc976497ef36d582bba75d9f5fbf6.png
DROP 

第七题 列转行

21782b6e5d466e6eb5b8c4aed0005d6a.png
-- 删除存在的表

第八题 日期间隔问题

  1. 拥有2辆及以上车的人每辆车的购车金额占个人总购车金额的比重。

1bcdaca9c9c210b19aec88f64320ba92.png
DROP 

2. 求出个人两次购车间隔不超过90天的记录。

ac02e19ff9d7283c0301d1d855ac59fa.png
SELECT 

参考文献

  1. 没有窗口函数,你能很快做出这道MySQL面试题吗?
  2. 看似简单的一道SQL面试题,你是否能够很快写出答案?
  3. 数据分析SQL面试题目9套汇总
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值