前言
资源全部来自于网络,我会尽量在每一题上都写上注释,没什么好说的,做就完事了。
第一题 计算月最大值
-- 建表
第二题 计算性别合计
计算各院系的男女计数以及合计。
-- 建表
第三题 计算仓库合计(动态SQL)
使用动态SQL,仓库并不一定只有例子中的1234,可能有5678。 我的想法是这是个行列转换的题,用case...when语句,但是仓库的值不确定,所以考虑变量设置SQL语句。
- 先查询表中的非重复仓库
- 子查询group by,通过select向字符串变量里循环添加case...when语句
- 外层再嵌套一个group by,最后拼接所有的变量sql字符串
- 使用预处理执行sql语句
如果是静态SQL,就需要像上面一体不停的根据表中仓库变化,自己手动添加case,运用动态SQL就不需要自己手动添加 这个解法硬解可以,但肯定不是最好,希望有更好的解法。
-- 建表
第四题 计算年月累计值
需要求的是月合计,年累加,总累加。
-- 删除表
第五题 前n个字符串拼接
求userid对应前两个不同的场景,如果场景重复则选择第一次访问时间,场景号不足两个的输出一个即可。
我的思路是先根据userid和area分组,此时出来的数据就是每个user去过的每个area,再使用窗口函数赋予排名,将排名<=2取出,最后再根据userid分组进行concat拼接。
-- 删除表
第六题 连续签到问题
用户每天打卡一次为一条数据,可能存在重复行,同一天多条打卡记录算作一天打卡,假设今天为2020/08/06。
-- 删除表
查询2020/08/06当天打卡的用户。
SELECT
现在有个七天活动,活动时间是从2020/07/31-2020/08/06的,我想知道2020/08/06这一天每个用户最近打卡日期及活动累计登录天数 。
SELECT
我想查询截止至2020/08/06当天连续打卡3天的用户(包含2020/08/06)。
SELECT
用户历史最大连续签到天数及该次记录的最后一天签到日期。(这题自己随便想的,实在是没什么好的解法)
DROP
第七题 列转行
-- 删除存在的表
第八题 日期间隔问题
- 拥有2辆及以上车的人每辆车的购车金额占个人总购车金额的比重。
DROP
2. 求出个人两次购车间隔不超过90天的记录。
SELECT
参考文献
- 没有窗口函数,你能很快做出这道MySQL面试题吗?
- 看似简单的一道SQL面试题,你是否能够很快写出答案?
- 数据分析SQL面试题目9套汇总