导读
今天参加了一场数据分析师面试,遴选3道记录以资后鉴。
1. SQL求两表差集
用SQL实现黄色部分查询
求差集在其他SQL语句中存在关键词Except的用法,而MySQL中没有,所以需要用其他方法折中实现。但实现本身也不难。
以公共字段为id示例,提供两种常规思路:
用最常规的语法(说人话的实现语句)是用in:
SELECT *
FROM A
WHERE id not in (SELECT id FROM B)
当然,能用关键字in实现的语句基本上都可以用exists实现:
SELECT *
FROM A
WHERE not exists (SELECT 1 FROM B WHERE A.id=B.id)
用子查询实现逻辑简单,语句更为直接,但执行效率一般较差,至于用in还是exists又要取决于索引情况和A、B两表数据规模情况。
实现两表差集更为可取的做法是用表连接:
SELECT A.*
FROM A left join B
using(id)
WHERE B.id is null
表连接方式更为高效,如果当B表较大但id列存在有效索引时,实际上还存在一点优化的空间和技巧:
SELECT A.*
FROM A left join
(SELECT id FROM B) C
using(id)
WHERE C.id is null
这里假定B表id字段已建立索引,进而通过覆盖索引查询B表id字段形成衍生表C,会大大加速查询过程,进而优化表连接查询结果。
2. 64匹马竞技取前4
实话说,这道题曾经见过,但无奈当时并未仔细思考。面试现场,脑中想到了可能的解决框架:
实际上,实现起来却尽是浆糊,剪不断理还乱。最后,只能给出中规中矩的晋级策略,也是最常规和最差的方案:每8匹马取前4,逐轮晋级,64→32→16→8→4,共需15轮。
而更为理想的策略仅需10-11轮:
第1-8轮竞技
第9轮竞技
经过此轮,能得到很多信息量:
第10轮,选出最终2-3-4名
最终,总轮次仅需10-11轮。
3. 业务异常点分析
业务面中,遇到了一个经典的异常业务数据分析题,虽然是一道主观题,但实际上也是有框架的,不幸的是自己当时陷入了分析陷阱中:想当然的顺着面试官的暗示,将这个问题归结为一定是异常,然后展开具体分析。而更一般的分析框架应该是这样的:
业务异常点分析思路框架